zoukankan      html  css  js  c++  java
  • HDU 5676 ztr loves lucky numbers (模拟)

    ztr loves lucky numbers

    题目链接:

    http://acm.hust.edu.cn/vjudge/contest/121332#problem/I

    Description

    ztr loves lucky numbers. Everybody knows that positive integers are lucky if their decimal representation doesn't contain digits other than 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.

    Lucky number is super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.

    One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.

    Input

    There are T cases

    For each cases:

    The only line contains a positive integer . This number doesn't have leading zeroes.

    Output

    For each cases
    Output the answer

    Sample Input

    2
    4500
    47

    Sample Output

    4747
    47

    题意:

    定义super number:
    有且仅有4和7两个数字,且两个数字出现的次数相同.
    给出n,求最小的不小于n的super number

    题解:

    xjb打了一通大模拟,结果越打越觉得坑;
    还好分清细节后过掉了;
    模拟思路:考虑当前数位能是否能放4或7(用strcmp比较后续数);
    当两数大小确定后,后面的序列应按最小顺序编排;

    另解:

    1. 直接打表然后二分.
    2. 用next_permutation获取可能的组合再比较.

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #define LL long long
    #define eps 1e-8
    #define maxn 3100
    #define inf 0x3f3f3f3f
    #define IN freopen("in.txt","r",stdin);
    using namespace std;
    
    char num[25];
    int cnt;
    
    int main(int argc, char const *argv[])
    {
        //IN;
        //freopen("out.txt","w",stdout);
    
    //    printf("%d
    ", 1000000);
    //    for(int i=1; i<=1000000; i++)
    //        printf("%d
    ", i);
    
        int t; cin >> t; getchar();
        //int t = 0;
        while(t--)
        {
            LL n=0,cmps=0;
            char c;
            cnt = 0;
            memset(num,0,sizeof(num));
            gets(num);
    
            for(int i=0; i<strlen(num); i++) {
                if(num[i]<'0' || num[i]>'9') break;
                cnt++;
                n = n*10 + num[i] - '0';
            }
            num[cnt] = 0;
    
            if(cnt&1) {
                for(int i=1; i<=(cnt+1)/2; i++) printf("4");
                for(int i=1; i<=(cnt+1)/2; i++) printf("7");
                printf("
    ");
                continue;
            }
    
            for(int i=1; i<=cnt/2; i++) cmps = cmps*10 + 7;
            for(int i=1; i<=cnt/2; i++) cmps = cmps*10 + 4;
    
            if(cmps < n) {
                for(int i=1; i<=(cnt+2)/2; i++) printf("4");
                for(int i=1; i<=(cnt+2)/2; i++) printf("7");
                printf("
    ");
                continue;
            }
    
            char ans[25] = {0};
            int si=cnt/2,qi=cnt/2;
            for(int i=0; i<cnt; i++) {
                if(num[i]<'4') {
                    if(si) ans[i] = '4', si--;
                    else ans[i] = '7', qi--;
                    for(int j=0; j<=i; j++) printf("%c", ans[j]);
                    while(si--) printf("4");
                    while(qi--) printf("7");
                    printf("
    ");
                    break;
                }
                if(num[i] == '4') {
                    char tmp[25] = {0};
                    for(int j=0; j<qi; j++) tmp[j] = '7';
                    for(int j=qi; j<qi+si-1; j++) tmp[j] = '4';
                    if(!si || strcmp(tmp,num+i+1) < 0) {
                        ans[i] = '7'; qi--;
                        for(int j=0; j<=i; j++) printf("%c", ans[j]);
                        while(si--) printf("4");
                        while(qi--) printf("7");
                        printf("
    ");
                        break;
                    }
                    if(strcmp(tmp,num+i+1) == 0) {
                        ans[i] = '4'; si--;
                        for(int j=0; j<=i; j++) printf("%c", ans[j]);
                        printf("%s",tmp);
                        printf("
    ");
                        break;
                    }
                    ans[i] = '4'; si--;
                    continue;
                }
                if(num[i] == '7') {
                    char tmp[25] = {0};
                    for(int j=0; j<qi-1; j++) tmp[j] = '7';
                    for(int j=qi-1; j<qi+si-1; j++) tmp[j] = '4';
                    if(!qi || strcmp(tmp,num+i+1) < 0) {
                        for(int i=1; i<=(cnt+2)/2; i++) printf("4");
                        for(int i=1; i<=(cnt+2)/2; i++) printf("7");
                        printf("
    ");
                        break;
                    }
                    if(strcmp(tmp,num+i+1) == 0) {
                        ans[i] = '7'; qi--;
                        for(int j=0; j<=i; j++) printf("%c", ans[j]);
                        printf("%s",tmp);
                        printf("
    ");
                        break;
                    }
                    ans[i] = '7'; qi--;
                    continue;
                }
    
                ans[i] = '7'; qi--;
                for(int j=0; j<=i; j++)
                    printf("%c", ans[j]);
                while(si--) printf("4");
                while(qi--) printf("7");
                printf("
    ");
                break;
            }
    
            //printf("
    ");
        }
    
        return 0;
    }
    
  • 相关阅读:
    在Spring Boot中使用内存数据库
    在Spring Boot使用H2内存数据库
    Spring Boot中Spring data注解的使用
    Spring Boot JPA中java 8 的应用
    数字签名
    Java NIO系列教程(七) FileChannel
    Java NIO系列教程(六) Selector
    Java NIO系列教程(五) 通道之间的数据传输
    Java NIO系列教程(四) Scatter/Gather
    Java NIO系列教程(三) Buffer
  • 原文地址:https://www.cnblogs.com/Sunshine-tcf/p/5697254.html
Copyright © 2011-2022 走看看