小O有一个长度为 n 的数组 a ,他现在想要选择其中一个数字进行“二进制翻转”操作,他想知道有多少种可能的选择方式,使得操作后的数组总和比不操作更大。 二进制翻转:指将 x 的二进制翻转,翻转后去除前导 0。 (例如: 12=(1100)_2,f(12) = (0011)_2 = 3 。)
第一行输入一个正整数 n(1 ≤ n ≤ 2*10^5) ,表示数组 a 的长度。 第二行输入 n 个正整数 a_1,a_2,...,a_n(1 ≤ a_i ≤ 10^9) ,表示数组 a 的元素。
在一行上输出一个整数,表示合法的方案数。
5 11 12 11 13 12
2
6 1 2 3 4 5 6
0
考点:模拟
数据规模 n ≤ 200000 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:模拟
不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。
思路框架(模拟 通法 · 非本题专属)
实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。
复杂度:时间 O(操作次数) | 空间 O(状态数)
该范式的通法易错点
对照本题
样例 1:输入 5 / 11 12 11 13 12 → 输出 2
(11)_10=(1011)_2 ,翻转后变为 (1101)_2 ,大于翻转前;
(12)_10=(1100)_2 和 (13)_10=(1101)_2 翻转后均小于翻转前。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2024年秋招-OPPO-后端开发笔试;2024年秋招-OPPO-研发通用岗笔试。