1 条题解

  • 0
    @ 2026-10-26 13:21:31

    思路与算法

    枚举1至1000。对当前数不断除2,根据余数是1还是0累加位数;1的数量严格大于0的数量则A计数增加,最后输出A及1000-A。

    正确性说明

    除2取余逐步给出完整二进制位,到商0停止,未添加前导0。比较条件与定义相同,等量情况归B。每个整数被枚举一次、唯一归类,故两数总和1000且分类正确。独立答案用Python二进制文本直接数1和0。

    复杂度

    推广上界B时O(B log B)时间、O(1)额外空间。固定B=1000,最多10次取位,实际常量开销;两个计数变量初始化O(1)。

    易错点

    不能把数字按固定32位补0,否则分类改变。1本身的二进制为1,归A。相等时归B,不是A。只输出两个总数而不是逐个列举。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        int a = 0;
        for (int n = 1; n <= 1000; ++n) {
            int ones = 0, zeros = 0;
            for (int x = n; x; x /= 2)
                if (x % 2)
                    ++ones;
                else
                    ++zeros;
            a += ones > zeros;
        }
        cout << a << ' ' << 1000 - a << '\n';
    }
    
    • 1

    信息

    ID
    1754
    时间
    1000ms
    内存
    64MiB
    难度
    入门
    标签
    递交数
    1
    已通过
    1
    上传者