ztr loves lucky numbers
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 918 Accepted Submission(s): 389
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
Source
问题描述
ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4、7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少
输入描述
有T(1≤T≤105)组数据,每组数据一个正整数n,1≤n≤1018
输出描述
有T行,每行即答案
输入样例
2 4500 47
输出样例
4747 47
Hint
请尽可能地优化算法,考虑全面
//没啥说的,就是一个dfs模拟,但是得注意一个特判,见代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
#define ll long long
#define N 100010
using namespace std;
ll a[N];
int cnt;
void dfs(int l,int r,int len,ll num)
{
if(l>len/2||r>len/2) return ;
if(l+r==len&&l==r)
{
a[cnt++]=num;
return ;
}
if(l<=len/2) dfs(l+1,r,len,num*10+4);
if(r<=len/2) dfs(l,r+1,len,num*10+7);
}
int main()
{
cnt=0;
for(int i=2;i<=18;i+=2)
dfs(0,0,i,0);
int t;
ll n;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
if(n>777777777444444444ll) //特判
printf("44444444447777777777\n");
else
printf("%lld\n",a[lower_bound(a,a+cnt,n)-a]);
}
return 0;
}