您的位置:首页 > 其它

ztr loves lucky numbers--hdu5676(DFS)

2016-05-03 15:54 99 查看
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\n");
continue;
}
if(m>777777777444444444)
{
printf("44444444447777777777\n");
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\n",a[l]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: