1 条题解

  • 1
    @ 2025-5-6 0:54:56

    题目分析

    题意简述

    本题接受多组测试数据,每组数据包含三个整数nnmmkk以及两个分隔字符。当输入的整数nn1-1时,程序结束。对于每组有效输入,通过对两个**位集合(bitset)**进行一系列的位操作,最终输出nnmmkk以及经过操作后位集合中被设置为11的位的数量。

    输入

    • 多组测试用例,每组首先输入一个整数nn,若n=1n = -1,则程序结束。
    • nn不为1-1,继续输入一个字符、整数mm、字符、整数kk,其中字符用于分隔数据。

    输出

    对于每组有效输入,按照格式“nn,mm,kk: countcount”输出,其中nnmmkk为输入的整数,countcount是经过一系列位操作后得到的位集合中值为11的位的数量。


    解题思路

    位集合初始化

    1. 定义两个bitset<130>类型的变量ccaa,其中bitset是一种用于处理位集合的数据结构。
    2. 使用a.set(i)将位集合aa的前nn位设置为11,表示初始的一种状态。
    3. 使用c.set(i)将位集合cc的前mm位设置为11 ,表示另一种初始状态。

    位操作与状态更新

    通过循环for(int i = 0; i < k; i++),对cc进行kk次操作:

    1. 首先检查cc的第n1n - 1位是否为11,即bool l = c.test(n - 1);
    2. cc左移一位得到新的位集合tt,即bitset<130> t = c<<1;
    3. 如果cc的第n1n - 1位为11,则将tt的第00位设置为11,即if(l) t.set(0);
    4. 通过异或操作c = c ^ t;更新cc的状态。

    结果计算与输出

    1. 使用按位与操作c = c & a;,将ccaa进行按位与,得到最终的位集合状态。
    2. 通过c.count()获取最终位集合cc中值为11的位的数量,并按照格式“nn,mm,kk: countcount”输出结果。

    代码实现

    #include <stdio.h>
    #include <bitset>
    using namespace std;
    int n, m, k;
    char f;
    int main() {
        while(1){
            scanf("%d", &n);
            if(!(~n)) return 0;
            bitset<130> c;
            bitset<130> a;
            for(int i = 0; i < n; i++) a.set(i);
            scanf("%c%d%c%d", &f, &m, &f, &k);
            for(int i = 0; i < m; i++) c.set(i);
            for(int i = 0; i < k; i++){
                bool l = c.test(n - 1);
                bitset<130> t = c<<1;
                if(l) t.set(0);
                c = c ^ t;
            }
            c = c & a;
            printf("%d,%d,%d: %d\n", n,m,k,c.count());
        }
        return 0;
    }
    

    代码说明

    1. 变量定义:定义全局变量nnmmkk用于存储输入的整数,ff用于存储分隔字符。
    2. 输入处理:通过while(1)循环持续读取输入,使用scanf("%d", &n);读取整数nn,当n=1n = -1时,通过if(!(~n)) return 0;结束程序。继续使用scanf("%c%d%c%d", &f, &m, &f, &k);读取分隔字符和整数mmkk
    3. 位集合初始化:创建位集合ccaa,并分别通过循环将aa的前nn位、cc的前mm位设置为11
    4. 位操作循环:通过循环对cc进行kk次操作,包括检查特定位、左移、条件设置位以及异或操作,更新cc的状态。
    5. 结果计算与输出:对ccaa进行按位与操作,然后通过c.count()获取cc中值为11的位的数量,并按照指定格式输出结果。
    • 1

    信息

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