Petya 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 Petya came across a positive integer n. Help him to find the least super lucky number which is not less than n.
InputThe only line contains a positive integer n (1 ≤ n ≤ 10100000). This number doesn't have leading zeroes.
OutputOutput the least super lucky number that is more than or equal to n.
Examples4500
4747
47
47
题目大意:输入一个正整数,求不小与这个数的最小的超级幸运数(超级幸运数是4和7的个数相同的数,并且只有4和7)
思路:这道题dfs能过真是吓到我了,数据这么大,这也能过只能说数据有点水,思路看代码吧
#include<iostream> #include<string.h> #include<map> #include<cstdio> #include<cstring> #include<stdio.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=1e6+10; const int maxk=5e3+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 char a[maxn],ans[maxn]; int len; bool dfs(int pol,int sum1,int sum2,bool limit)//当前位,4的个数,7的个数,是否已经没有限制了 { if(pol>=len) return true; if(limit)//没有限制了,那么直接把剩余的4和7放进去就可以了 { for(int i=0;i<sum1;i++) ans[pol++]='4'; for(int i=0;i<sum2;i++) ans[pol++]='7'; return true; } if(sum1&&a[pol]<='4') { if(dfs(pol+1,sum1-1,sum2,a[pol]!='4')) { ans[pol]='4'; return true; } } if(sum2&&a[pol]<='7') { if(dfs(pol+1,sum1,sum2-1,a[pol]!='7')) { ans[pol]='7'; return true; } } return false;//4和7都不能选,那么代表要加两位数了 } int main() { cin>>a; len=strlen(a); if(len&1||!dfs(0,len/2,len/2,0))//如果长度是奇数的话直接加一位数,前面的是4后面的是7,判断偶数的时候是否有满足条件的数 { if(len&1) len++; else len+=2; int i; for(i=0;i<len/2;i++) ans[i]='4'; for(i;i<len;i++) ans[i]='7'; } cout<<ans<<endl; return 0; }