SDUT 2538 Lucky Transformation

---恢复内容开始---

Lucky Transformation

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2538

Time Limit: 1000MS    Memory limit: 65536K

题目描述

ZYJ非常喜欢幸运数字4,和7,他认为只要是只含有47的数字就是幸运的。比如,4,474477,7都是幸运的,427就不是。 现在有一个n位没有前导零的数字d,从最高位认为是第一位。ZYJ想看看这个数字能否经得起变化.如果这个数字里面有一个连着的“47,那么就做这样的操作:如果4的位数是奇数,那么就把47变成44,如果是偶数,那么就把47变成77。而且ZYJ闲着没事想做K次操作,每次只改变一个4所在位数最小的47.但是他再出门买食物的时候不小心用门把脑袋夹了,各位大神你可以帮ZYJ完成这个神圣而光荣的任务吗?(如果执行到m次后没有发现47,那么就直接输出m次以后的结果)

输入

第一行输入两个数nandk(1 ≤ n ≤ 105, 0 ≤ k ≤ 109)分别代表位数和执行次数。第二行输入这个数。

输出

输入操作后的结果。

示例输入

7 4
4727447

示例输出

4427477



2538

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>

using namespace std;

string num;
int n,k;

string change(string str){
    int i,len=str.length();
    for(i=0;i<len;i++)
        if(i+1<len && str[i]=='4' && str[i+1]=='7'){
            if((i+1)%2==1)
                str[i+1]='4';
            else
                str[i]='7';
            break;
        }
    return str;
}

int main(){
    while(scanf("%d%d",&n,&k)!=EOF){
        map<string,int> mp;
        cin>>num;
        mp[num]++;
        int flag=1;
        for(int i=1;i<=k;i++){
            num=change(num);

            if(flag && mp[num]){  //只寻找第一个周期的相应数字
                k=k%i;
                i=0;
                flag=0;
            }
            mp[num]++;
        }
        cout<<num<<endl;
    }
    return 0;
}

 

 

posted @ 2013-01-01 15:54  Jack Ge  阅读(250)  评论(0编辑  收藏  举报