hdu 5676 ztr loves lucky numbers

来源:互联网 发布:淘宝卖家体验用心在哪 编辑:程序博客网 时间:2024/06/01 09:18

ztr loves lucky numbers

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


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
2450047
 

Sample Output
474747
 

   首先找出所有的幸运数字,再进行查找

   例如47 74 4477 4747 4774 7447 7474 7744.........

  用dfs枚举即可,再存放在set中,用lower_bound查找第一个不小于输入数字的元素。

  当输入大于 777777777444444444时,满足条件的下一个幸运数超出long long 的范围,所以要特判。

#include <iostream>#include <cstdio>#include <set>using namespace std;typedef long long ll;ll a[262220];set<ll>b;void dfs(ll x,ll y,ll cnt){  if(x==0&&y==0)  {    b.insert(cnt);    return;  }  if(x>0) dfs(x-1,y,cnt*10+4);  if(y>0) dfs(x,y-1,cnt*10+7);}int main(){    int t;    b.insert(47);    b.insert(74);    for(int i=2;i<=9;i++)    {      dfs(i,i,0);    }    scanf("%d",&t);    ll n;    while(t--)    {      scanf("%lld",&n);      if(n>777777777444444444)      {        printf("44444444447777777777\n");        continue;      }      printf("%lld\n",*b.lower_bound(n));    }    return 0;}




 
0 0
原创粉丝点击