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.
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
(1≤n≤105)
cases
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
Output
For each cases
Output the answer
Output the answer
Sample Input
2 4500 47
Sample Output
4747 47题意: 幸运数是只含有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; }