• HDU 5676 ztr loves lucky numbers


    ztr loves lucky numbers

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 51    Accepted Submission(s): 24


    Problem 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(1n105) cases

    For each cases:

    The only line contains a positive integer n(1n1018). This number doesn't have leading zeroes.
     

    Output
    For each cases
    Output the answer
     

    Sample Input
    2 4500 47
     

    Sample Output
    4747 47
    把1到10^20中满足条件的全部枚举出来,然后再二分查找就可以了。
    注意20位最小的44444444447777777777在是超long long int 的
    只好进行一下特判
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <math.h>
    #include <stdio.h>
    #include <string>
    #include <map>
    
    using namespace std;
    #define MAX 600000
    typedef __int64 LL;
    LL n;
    LL a[MAX];
    int cnt;
    void dfs(LL x,LL y,LL num)
    {
        if(x==0&&y==0)
        {
            a[++cnt]=num;
            return;
        }
        if(x>0)
           dfs(x-1,y,num*10+4);
        if(y>0)
           dfs(x,y-1,num*10+7);
    }
    void fun()
    {
        a[1]=47;
        a[2]=74;
        cnt=2;
        for(int i=4;i<=18;i+=2)
        {
            dfs(i/2,i/2,0);
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        fun();
        sort(a+1,a+cnt+1);
        while(t--)
        {
           scanf("%I64d",&n);
           if(n>777777777444444444)
           {
               cout<<"44444444447777777777"<<endl;
               continue;
           }
           LL l=1,r=cnt;
           LL res;
           while(l<=r)
           {
               LL mid=(l+r)/2;
               if(a[mid]>=n)
               {
                   res=a[mid];
                   r=mid-1;
               }
               else
                   l=mid+1;
           }
           printf("%I64d
    ",res);
        }
        return 0;
    }


     
  • 相关阅读:
    通过url在两个页面之间传值
    $.ajax数据传输成功却执行失败的回调函数
    5.26小测
    洛谷——AC记
    7.2模拟赛
    6.30模拟赛
    洛谷——每日一题
    洛谷——动态规划
    致创营
    BSGS
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228671.html
Copyright © 2020-2023  润新知