zoukankan      html  css  js  c++  java
  • 牛客练习赛13 幸运数字Ⅲ

    链接:https://www.nowcoder.com/acm/contest/70/C
    来源:牛客网

    题目描述

    定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
    比如说,47、744、4都是幸运数字而5、17、467都不是。
    假设现在有一个数字d,现在想在d上重复k次操作。
    假设d有n位,用d1,d2,...,dn表示。
    对于每次操作,我们想要找到最小的x (x < n),使得dx=4并且dx+1=7。
    如果x为奇数,那么我们把dx和dx+1都变成4;
    否则,如果x为偶数,我们把dx和dx+1都变成7;
    如果不存在x,那么我们不做任何修改。
    现在请问k次操作以后,d会变成什么样子。

    输入描述:

    第一行两个整数n,k表示d的长度和操作次数。
    第二行一个数表示d。数据保证不存在前导零。
    1 <= n <= 100,000
    0 <= k <= 1000,000,000

    输出描述:

    一个数字表示答案。
    示例1

    输入

    7 4
    4727447

    输出

    4427477
    示例2

    输入

    4 2
    4478

    输出

    4478

    分析:找规律,发现“......447...”的时候,如果7前面的4的序号是偶数(这里序号从1开始),
    就变为“......477......”,下次找到4的时候,4的序号是奇数,就变成“......447...”,
    这是一个循环,这样就好办多了。。。

    #include<cstdio>
    char s[200000];
    int main()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        scanf("%s",s);
        int i,flag;
        while(k--)
        {
            i=0,flag=0;
            while(i<n)
            {
                if(s[i]=='4'&&s[i+1]=='7')
                {flag=1;break;}
                i++;
            }
            if(flag==0) break;
            if(s[i+2]=='7'&&i%2==0)//两个7 ,477->447
            {
                if(k%2==0)
                s[i+1]='4';
                break;
            }
            if(i-1>=0&&s[i-1]=='4'&&i%2==1)
            {
                if(k%2==0)
                s[i]='7';
                break;
            }
            if(i%2==0) s[i+1]='4';
            else s[i]='7';
        }
        
        printf("%s
    ",s);
        return 0;
    }
    View Code


  • 相关阅读:
    代理模式
    面向对象设计原则
    砝码破碎
    阿里EasyExcel使用
    IBM的OpenJ9
    java反射 (复习)
    DecimalFormat保留小数
    Object类
    SQLMAP用法
    SQL盲注之时间注入
  • 原文地址:https://www.cnblogs.com/ACRykl/p/8586295.html
Copyright © 2011-2022 走看看