版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83244221
Description
定义一个数字为幸运数字当且仅当它的所有数位都是 或者 。
比如说, 都是幸运数字而 都不是。
假设现在有一个数字 ,现在想在 上重复 次操作。
假设 有 位,用 表示。
对于每次操作,我们想要找到最小的 ,使得 并且 。
如果 为奇数,那么我们把 和 都变成 ;
否则,如果 为偶数,我们把 和 都变成 ;
如果不存在 ,那么我们不做任何修改。
现在请问 次操作以后, 会变成什么样子。
Input
第一行两个整数 表示 的长度和操作次数。
第二行一个数表示 。数据保证不存在前导零。
Output
一个数字表示答案。
Sample Input
7 4
4727447
Sample Output
4427477
Solution
对于偶数位置的 ,若前一个位置是 ,那么就会有循环
对于奇数位置的 ,若后一个位置是 ,那么就会有循环
只要有这两种情况则不用进行后续操作,直接判断剩余操作次数的奇偶性即可,否则一个个往后更新
时间复杂度
Code
#include<cstdio>
using namespace std;
const int maxn=100005;
int n,k;
char s[maxn];
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+1);
for(int i=1;i<n;i++)
if(s[i]=='4'&&s[i+1]=='7')
{
if((i&1)&&i+2<=n&&s[i+2]=='7')
{
if(k&1)s[i+1]='4';
k=0;
}
else if(!(i&1)&&i-1>=1&&s[i-1]=='4')
{
if(k&1)s[i]='7';
k=0;
}
else
{
if(i&1)s[i+1]='4';
else s[i]='7';
k--;
}
if(!k)break;
}
printf("%s\n",s+1);
return 0;
}