ztr loves lucky numbers--hdu5676(DFS)

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
");
            continue;
        }
        if(m>777777777444444444)
        {
            printf("44444444447777777777
");
            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
",a[l]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linliu/p/5455285.html