您的位置:首页 > 其它

HDU 5676 ztr loves lucky numbers

2017-09-08 19:09 274 查看


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.

 

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题意: 幸运数是只含有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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: