HDoj ztr loves lucky numbers 5676(dfsシミュレーション)

7964 ワード

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.
 
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.
 
Output
For each cases
Output the answer
 
Sample Input

   
   
   
   
2 4500 47

 
Sample Output

   
   
   
   
4747 47

 
Source
BestCoder Round #82 (div.2)
問題の説明
ztr      ,            
1:          4、7
2:       4 7     
  47,474477  
 4,744,467   

  ztr          n        

説明の入力
 T(1\leq\;T\leq\;10^{5})T(1T105)nn1\leq\;n\leq\;10^{18}1n1018

出力の説明
 TT

入力サンプル
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
"); else printf("%lld
",a[lower_bound(a,a+cnt,n)-a]); } return 0; }