zoukankan      html  css  js  c++  java
  • [测试题]幸运序列(lucky)

    Description

    Ly喜欢幸运数字,众所周知,幸运数字就是数字位上只有4和7的数字。

    但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列。哈哈,是不是感觉被耍了,没错,你就是被耍了。

    Ly现在手上有一个长度为N的幸运序列a,他想这样子折腾这个序列:

    1. 如果已经折腾了k次了,就结束,否则找到一个最小的i,使得(a[i]=’4’ && a[i+1]=’7’)  //0<i<N;
    2. 找不到这样的i就结束;
    3. 如果odd(i),令a[i+1]=a[i],否则令a[i]=a[i+1],继续第一步。

    Ly想让你告诉他最后序列折腾成什么样子了。

    需要注意的是,本题的序列从1开始编号

    Input

    第一行N,K;

    第二行N个数描述序列a。

    Output

    N个数,输出最后的序列。

    Sample Input

    7 4

    4727447

    Sample Output

    4427477

    Hint

    20%:  小数据

    100%的数据中N<=100000,K<=109

    题解

    找规律,模拟

    可以发现只有开始位置为奇数的$447$或$477$存在循环现象,而只要没有出现循环,修改操作的总次数不会超过$N$。

    接下来就只要按照题意模拟即可。

     1 #include<set>
     2 #include<map>
     3 #include<cmath>
     4 #include<ctime>
     5 #include<queue>
     6 #include<stack>
     7 #include<vector>
     8 #include<cstdio>
     9 #include<string>
    10 #include<cstring>
    11 #include<cstdlib>
    12 #include<iostream>
    13 #include<algorithm>
    14 #define LL long long
    15 using namespace std;
    16 const int N=100000;
    17 
    18 int n,k;
    19 char ch[N+5];
    20 bool vis[N+5];
    21 
    22 int main()
    23 {
    24     scanf("%d%d",&n,&k);
    25     scanf("%s",ch+1);
    26     for (int i=1;i<n;i++) if (ch[i]=='4'&&ch[i+1]=='7')
    27     {
    28         if (vis[i]&&!(k%2)) {vis[i]=1;break;}
    29         vis[i]=1;
    30         if (i%2) ch[i+1]=ch[i];
    31         else ch[i]=ch[i+1],i-=2;
    32         k--;
    33         if (!k) break;
    34     }
    35     printf("%s",ch+1);
    36     return 0;
    37 }
  • 相关阅读:
    SQLite的使用
    Messenger类的使用
    Binder的使用(跨进程——AIDL,非跨进程)
    Android Studio中如何创建AIDL
    第二章——Parcelable接口的使用(跨进程,Intent传输)
    InetAddress的作用
    第二章——Serializable的使用(跨进程使用和Intent的传递对象)
    SurfaceView绘图机制
    双缓冲机制简介
    内部类代码
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/7418957.html
Copyright © 2011-2022 走看看