HDU 5676 ztr loves lucky numbers

来源:互联网 发布:篡改或者伪造监测数据 编辑:程序博客网 时间:2024/06/17 11:25

ztr loves lucky numbers

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


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
题意: 幸运数是只含有4和7的数字,最幸运的数字是只含有4和7的数字并且4的数量和7的数量相等。给你一个数,让你求比它大的最小的幸运数。
思路: 因为只含有最幸运数只含有4和7并且4和7的数量相等,所以就算最大为10的18次方,总共的最幸运数也是可以数的过来的,所以,可以用打表的方式打出所有的幸运数,然后再寻找就可以。注意特判情况。
代码1:
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;long long a[500000];int cnt;void dfs(int left,int right,long long num){if(left==0&&right==0){a[++cnt]=num;return ;}if(left>0){dfs(left-1,right,num*10+4);}if(right>0){dfs(left,right-1,num*10+7);}}int main(){int i,j;long long x;cnt=0;for(i=2;i<=18;i+=2){dfs(i/2,i/2,0);}//printf("%d\n",cnt);/*for(i=1;i<=100;i++){printf("%lld\n",a[i]);}*/sort(a+1,a+cnt+1);int n;scanf("%d",&n);while(n--){scanf("%lld",&x);if(x>777777777444444444){            cout<<"44444444447777777777"<<endl;            continue;        }for(i=1;i<=cnt;i++){if(a[i]>=x){x=a[i];break;}}printf("%lld\n",x);}return 0;}


代码2: (用了 二分查找 )

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;long long a[500000];int cnt;void dfs(int left,int right,long long num){if(left==0&&right==0){a[++cnt]=num;return ;}if(left>0){dfs(left-1,right,num*10+4);}if(right>0){dfs(left,right-1,num*10+7);}}int main(){int i,j;long long x;cnt=0;for(i=2;i<=18;i+=2){dfs(i/2,i/2,0);}//printf("%d\n",cnt);/*for(i=1;i<=100;i++){printf("%lld\n",a[i]);}*/sort(a+1,a+cnt+1);int n;scanf("%d",&n);long long ans;while(n--){scanf("%lld",&x);if(x>777777777444444444){            cout<<"44444444447777777777"<<endl;            continue;        }        int left,right,mid;        left=1;        right=cnt;while(left<=right){mid=(left+right)>>1;if(a[mid]>=x){ans=a[mid];right=mid-1;}else{left=mid+1;}}printf("%lld\n",ans);}return 0;}



 
原创粉丝点击