链接:
https://www.nowcoder.com/acm/contest/70/C
来源:牛客网
来源:牛客网
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d 1,d 2,...,d n表示。
对于每次操作,我们想要找到最小的x (x < n),使得d x=4并且d x+1=7。
如果x为奇数,那么我们把d x和d x+1都变成4;
否则,如果x为偶数,我们把d x和d x+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d 1,d 2,...,d n表示。
对于每次操作,我们想要找到最小的x (x < n),使得d x=4并且d x+1=7。
如果x为奇数,那么我们把d x和d x+1都变成4;
否则,如果x为偶数,我们把d x和d x+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。
输入描述:
第一行两个整数n,k表示d的长度和操作次数。 第二行一个数表示d。数据保证不存在前导零。 1 <= n <= 100,000 0 <= k <= 1000,000,000
题解:
k可能很大,但是可以让t[0]不再变化时跳出,或者t[0]的变化
可能会进入一个循环,但这个循环的长多一定是2,因此可以对2取余。
代码:
#include<bits/stdc++.h>
using namespace std;
char t[4][100007];
int L,k;
void ds(int id)
{
for(int i=0;i<L-1;i++)
{
if(t[0][i]=='4'&&t[0][i+1]=='7')
{
if(i&1)t[0][i]=t[0][i+1]='7';
else t[0][i]=t[0][i+1]='4';
break;
}
}
for(int i=0;i<L;i++)
t[id][i]=t[0][i];
}
int main()
{
scanf("%d%d%s",&L,&k,&t[0]);
int ans=0;
while(k--)
{
ds(ans%3+1);
ans++;
if(ans%3==0)
{
if(strcmp(t[1],t[3])==0)
break;
}
}
k=k%2;
for(int i=0;i<k;i++)
{
ds(1);
}
printf("%s\n",t[0]);
return 0;
}
本文介绍了一个有趣的算法问题:如何通过特定规则对一个初始数字进行多次变换,并最终确定经过大量变换后的数字形态。此问题涉及字符串操作及循环检测等计算机科学概念。
3万+

被折叠的 条评论
为什么被折叠?



