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

本文介绍了一种针对幸运数字(仅包含4和7的数字)的变换算法,通过特定操作改变数字形态。算法考虑了数字的位置和操作次数,实现对数字序列的高效更新,最终输出变换后的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

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

比如说,47、744、447、744、4477444都是幸运数字而5、17、4675、17、467517467都不是。

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

假设dddnnn位,用d1,d2,...,dnd_1,d_2,...,d_nd1,d2,...,dn表示。

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

如果xxx为奇数,那么我们把dxd_xdxdx+1d_{x+1}dx+1都变成444

否则,如果xxx为偶数,我们把dxd_xdxdx+1d_{x+1}dx+1都变成777

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

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

Input

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

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

(1≤n≤105,0≤k≤109)(1\le n\le 10^5,0\le k\le 10^9)(1n105,0k109)

Output

一个数字表示答案。

Sample Input

7 4
4727447

Sample Output

4427477

Solution

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

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

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

时间复杂度O(n)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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值