1 条题解

  • 0
    @ 2025-8-24 21:07:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar DiDi123
    Have Faith

    搬运于2025-08-24 21:07:39,当前版本为作者最后更新于2021-07-12 14:03:14,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目分析

    这道题要求我们把 1n1 \sim n 的所有数分类,那我们只需要统计这个数的二进制有多少个 1100 就行了。有一种办法就是把这个数的二进制的每一位都提取出来。

    代码中用到的一些进制处理:

    xx (二进制形式)右移 nn 位:

    x>>n
    

    xxyy 按位与:

    x&y
    

    (按位且的规则:将 xxyy 的二进制按位比较,若一位都是 11 ,则返回 11 ,否则,返回 00


    那么,有了以上的铺垫,我们就能很轻松的提取了。我们这需要每次把数和 11 进行按位且操作,这样就能提取出这个数的最后一位,然后在把这个数右移一位就行了。

    代码

    #include <iostream>
    using namespace std;
    int A, B, cnt0, cnt1;
    int main() {
    	int n, t, temp;
    	cin >> n;
    	for (int i = 1; i <= n; i++) {
    		cnt0 = 0, cnt1 = 0;
    		t = i;
    		while (t) {
    			temp = t & 1;
    			t = t >> 1;
    			if (temp) cnt1++;
    			else cnt0++;
    		}
    		cnt1 > cnt0 ? A++ : B++;
    	}
    	cout << A << ' ' << B;
    }
    
    • 1

    信息

    ID
    6997
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者