首页 > 试题广场 >

小O的数位翻转

[编程题]小O的数位翻转
  • 热度指数:227 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小O有一个长度为 n 的数组 a,他现在想要选择其中一个数字进行“二进制翻转”操作,他想知道有多少种可能的选择方式,使得操作后的数组总和比不操作更大

二进制翻转:指将 x 的二进制翻转,翻转后去除前导 0。
(例如:12=(1100)_2,f(12) = (0011)_2 = 3。)

输入描述:
第一行输入一个正整数 n\ (1 \leq n \leq 2*10^5),表示数组 a 的长度。
第二行输入 n 个正整数 a_1,a_2,\dots,a_n\ (1 \leq a_i \leq 10^9),表示数组 a 的元素。


输出描述:
在一行上输出一个整数,表示合法的方案数。
示例1

输入

5
11 12 11 13 12

输出

2

说明

(11)_{10}=(1011)_2 ,翻转后变为 (1101)_2 ,大于翻转前;
(12)_{10}=(1100)_2(13)_{10}=(1101)_2 翻转后均小于翻转前。
示例2

输入

6
1 2 3 4 5 6

输出

0
const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
let n,
    arr = [];
rl.on("line", function (line) {
    if (!n) {
        n = parseInt(line.trim());
    } else {
        arr = line.trim().split(" ").map(Number);
        rl.close();
        let count = 0;
        for (let i = 0; i < n; i++) {
            const fz_ejz = arr[i].toString(2).split("").reverse().join("");
            const fz_sjz = parseInt(fz_ejz, 2);
            if (fz_sjz > arr[i]) {
                count += 1;
            }
        }
        console.log(count);
    }
});

发表于 2025-09-09 08:21:30 回复(0)