HDU 5676(枚舉 + 二分)

hdu 5676
題目大意:
已知幸運數的條件爲其十進制的每一位都由47 組成,且47 的個數相同;
思路:
從小到大枚舉每一位幸運數,二分尋找,特判大於77..744..4(97,94) 的數字;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define LL long long

using namespace std;

int cnt = 0;
int a[20];
LL b[68000];

void init()
{
    memset(b, 0, sizeof(b));

    for (int i = 1; i <= 9; i++)
    {

        for (int j = 0; j < i; j++)
        {
            a[j] = 4;
            a[j+i] = 7;  
        }

        do
        {
            LL sum = 0;
            for (int j = 0; j < 2 * i; j++)
            {
                sum = sum * 10 + a[j];
            }
            b[cnt++] = sum;

        } while (next_permutation(a, a + 2 * i));
    }
}

int main()
{
    init();

    int T;
    scanf("%d", &T);

    while (T--)
    {
        LL n;
        scanf("%lld", &n);

        if (n > 777777777444444444LL)
        {
            printf("44444444447777777777\n");
            continue;
        }

        printf("%lld\n", b[lower_bound(b, b + cnt, n) - b]);
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章