比得喜欢幸运数字。这里所说的幸运数字是由4和7组成的正整数。比如,数字47,744,4是幸运数字,而5,17,467就不是。
比得有一个没有前导0的n位数的整数。他用了一个数组d来表示这个整数。数组的第一个编号从数字的最高位开始,下标从1开始。比得想对d进行以下操作k次:
查找最小的x(1≤x<n)使得 dx = 4 且 dx+1 = 7 ,如果x是奇数,则让 dx = dx+1 = 4 ,否则,让 dx = dx+1 = 7 。
如果没有找到相应的x,则此次操作作为最后一次操作,数组保持不变。
现在,给定初始数字作为数组d,和数字k。帮助比得计算k次操作后的结果。
样例解释:
在样例中,数组的变化如下:
4727447→4427447→4427477→4427447→4427477。
Input
单组测试数据 第一行包含两个整数n和k(1≤n≤10^5,0≤k≤10^9)。 分别表示给定数字的位数,和操作的次数。 第二行有一个n位数的整数,代表数组d。第1位数代表d1。 题目保证数字的第1位数不为0。
Output
共一行,代表对数组d进行k次操作后的结果。
Input示例
7 4 4727447
Output示例
4427477
这题我自己坑...... 如果碰上了477或者是447 那么整串都会卡在这里 在这里不断的循环不断的循环所以到这里就结束了
所以每次一遇上47就判断下是不是属于477或者447的情况
属于这种情况的话那么就判断下k 就可以了..........我自己T了好久就一直没想到 心塞塞
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
char s[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",s+1);
for (int i=1;i<n&&k!=0;i++)
{
if (s[i]=='4'&&s[i+1]=='7')
{
k--;
if(i%2==1)//奇数
{
s[i+1]='4';
if(s[i+2] == '7')
{
if (k%2==1)
s[i+1]='7';
break;
}
}else//偶数
{
s[i]='7';
if(s[i-1]=='4')
{
if(k%2==1)
s[i]='4';
break;
}
}
}
}
printf("%s\n",s+1);
return 0;
}