1 条题解
-
1
题目分析
题意简述
本题接受多组测试数据,每组数据包含三个整数、、以及两个分隔字符。当输入的整数为时,程序结束。对于每组有效输入,通过对两个**位集合(bitset)**进行一系列的位操作,最终输出、、以及经过操作后位集合中被设置为的位的数量。
输入
- 多组测试用例,每组首先输入一个整数,若,则程序结束。
- 若不为,继续输入一个字符、整数、字符、整数,其中字符用于分隔数据。
输出
对于每组有效输入,按照格式“,,: ”输出,其中、、为输入的整数,是经过一系列位操作后得到的位集合中值为的位的数量。
解题思路
位集合初始化
- 定义两个
bitset<130>
类型的变量和,其中bitset
是一种用于处理位集合的数据结构。 - 使用
a.set(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;
,将与进行按位与,得到最终的位集合状态。 - 通过
c.count()
获取最终位集合中值为的位的数量,并按照格式“,,: ”输出结果。
代码实现
#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; }
代码说明
- 变量定义:定义全局变量、、用于存储输入的整数,用于存储分隔字符。
- 输入处理:通过
while(1)
循环持续读取输入,使用scanf("%d", &n);
读取整数,当时,通过if(!(~n)) return 0;
结束程序。继续使用scanf("%c%d%c%d", &f, &m, &f, &k);
读取分隔字符和整数、。 - 位集合初始化:创建位集合和,并分别通过循环将的前位、的前位设置为。
- 位操作循环:通过循环对进行次操作,包括检查特定位、左移、条件设置位以及异或操作,更新的状态。
- 结果计算与输出:对和进行按位与操作,然后通过
c.count()
获取中值为的位的数量,并按照指定格式输出结果。
- 1
信息
- ID
- 354
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者