51Nod 1637 幸运数字转换(思维)

题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题

比得喜欢幸运数字。这里所说的幸运数字是由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次操作后的结果。


样例解释:

在样例中,数组的变化如下:

47274474427447442747744274474427477。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值