Newcoder 70 C.幸运数字Ⅲ(水~)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/83244221

Description

定义一个数字为幸运数字当且仅当它的所有数位都是 4 4 或者 7 7

比如说, 47 744 4 47、744、4 都是幸运数字而 5 17 467 5、17、467 都不是。

假设现在有一个数字 d d ,现在想在 d d 上重复 k k 次操作。

假设 d d n n 位,用 d 1 , d 2 , . . . , d n d_1,d_2,...,d_n 表示。

对于每次操作,我们想要找到最小的 x ( x < n ) x (x < n) ,使得 d x = 4 d_x=4 并且 d x + 1 = 7 d_{x+1}=7

如果 x x 为奇数,那么我们把 d x d_x d x + 1 d_{x+1} 都变成 4 4

否则,如果 x x 为偶数,我们把 d x d_x d x + 1 d_{x+1} 都变成 7 7

如果不存在 x x ,那么我们不做任何修改。

现在请问 k k 次操作以后, d d 会变成什么样子。

Input

第一行两个整数 n , k n,k 表示 d d 的长度和操作次数。

第二行一个数表示 d d 。数据保证不存在前导零。

( 1 n 1 0 5 , 0 k 1 0 9 ) (1\le n\le 10^5,0\le k\le 10^9)

Output

一个数字表示答案。

Sample Input

7 4
4727447

Sample Output

4427477

Solution

对于偶数位置的 47 47 ,若前一个位置是 4 4 ,那么就会有循环 447 477 447 . . . 447\rightarrow 477\rightarrow 447\rightarrow...

对于奇数位置的 47 47 ,若后一个位置是 7 7 ,那么就会有循环 477 447 477 . . . 477\rightarrow 447\rightarrow 477\rightarrow ...

只要有这两种情况则不用进行后续操作,直接判断剩余操作次数的奇偶性即可,否则一个个往后更新

时间复杂度 O ( n ) O(n)

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;
}

猜你喜欢

转载自blog.csdn.net/V5ZSQ/article/details/83244221