1 条题解

  • 0
    @ 2024-10-26 16:25:56

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    int T, n, len;
    int cnt[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
    
    bool judge(int u, int v) // 判断用v个火柴棒拼成u个数位是否合法
    {
        if (v > u * 7)
            return 0;
        if (v < u * 2)
            return 0;
        return 1;
    }
    
    void work(int now, int sum) // 目前在填第now位,火柴棒还有sum个
    {
        if (!now)
            return;
        int st = 0;
        if (now == len) // 注意不能有前导零
            st = 1;
        for (int i = st; i <= 9; i++) // 尝试将i填到第now位
        {
            if (judge(now - 1, sum - cnt[i]))
            {
                printf("%d", i);
                work(now - 1, sum - cnt[i]);
                break;
            }
        }
    }
    
    int main()
    {
        cin >> T;
        while (T--)
        {
            scanf("%d", &n);
            if (n == 1)
            {
                puts("-1");
                continue;
            }
            len = (n + 6) / 7; // 计算最终的数位个数
            work(len, n);
            puts("");
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    1077
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者