http://acm.hdu.edu.cn/showproblem.php?pid=5676
题目大意: 给你一个数 让你找比这数大并且只含4和7 并且4和7的个数一样
枚举从0到10的18次方之间的所有的可能的数 在用二分搜索
因为20位超过longlong 所以特判一下
#include<stdio.h> #include<math.h> #include<algorithm> #include<iostream> #include<string.h> #include<stdlib.h> #define INF 0x3f3f3f3f3 using namespace std; long long a[70000]; long long int m; long long int cont=0; void DFS(int x,int y,long long num) { if(x==0 && y==0) { a[++cont]=num; return; } if(x>0) DFS(x-1,y,num*10+4); if(y>0) DFS(x,y-1,num*10+7); } void Find() { a[1]=47; a[2]=74; cont=2; for(int i=4;i<=18;i=i+2) { DFS(i/2,i/2,0); } } int main() { int T; Find(); scanf("%d",&T); while(T--) { scanf("%lld",&m); if(m==0) { printf("47 "); continue; } if(m>777777777444444444) { printf("44444444447777777777 "); continue; } int l,r; l=1;r=cont; while(l<=r) { int mid=(l+r)/2; if(a[mid]>m) { l=l; r=mid-1; } else if(a[mid]<m) { l=mid+1; r=r; } else if(a[mid]==m) { l=mid; break; } } printf("%lld ",a[l]); } return 0; }