前言
蓝桥杯2021年国赛B组,编程题(C++)
一、题目描述
输入输出样例
示例
输入
5 3
10110
输出
11010
样例说明
初始时为 10110,变换 1 次后变为 11101,变换 2 次后变为 10011,变换 3 次后变为 11010。
评测用例规模与约定
对于 40% 的评测用例,1 ≤ n ≤ 100, 1 ≤ t ≤ 1000。
对于 80% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ t ≤ 10^9。
对于所有评测用例,1 ≤ n ≤ 10000, 1 ≤ t ≤ 10^{18}。
运行限制
- 最大运行时间:3s
- 最大运行内存: 256M
二、思路
这个题目如果单纯模拟去做的话,大概40%的样例可以通过,但剩下的就会超时。这种情况往往是有规律可循的,我们拿几个较短的字符串去模拟这个过程:
输入n=5,t=8,不难发现,在第4次就开始循环往复了。
(0)01101
(1)01011
(2)01110
(3)01001
(4)01101 ←
(5)01011
(6)01110
(7)01001
(8)01101 ←
那么,最终的规律是当大于等于n的一个2的整数次幂情况下,必定存在循环。
也就是满足 max_per=2^x,max_per>=n,在这个max_per范围内,必定存在一个循环
三、具体代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,t;
cin>>n>>t;
string s;
cin>>s;
int max_per=1;
while(max_per<n)
{
max_per*=2;
}
t=t%max_per;
for(int i=0;i<t;i++)
{
for(int j=n-1;j>=1;j--)
{
s[j]=(s[j]-'0')^(s[j-1]-'0')+'0';
}
}
cout<<s<<endl;
return 0;
}
感谢Mr_渣渣辉 博主提供的题目集,图片出自2021第十二届蓝桥杯国赛C/C++大学B组题解_Mr_渣渣辉的博客-CSDN博客_2021蓝桥杯c语言b组答案