1. 程式人生 > 實用技巧 >C. Unique Number - CF1462C

C. Unique Number - CF1462C

題意:

給出一個數字x,讓你找出一個由1到9這九個數字組成的數字,這個數字的每一位加起來等於x,並且1到9每個數字只能出現一次。若能找到這樣的數字,輸出這其中最小的一個,否則輸出-1。

思路:

利用二進位制列舉,列舉每個1到9這九個數字是否出現。每次列舉若和等於x,則將被選中的數字從小到大排列,取得到的數字中最小的一個。若全部列舉完之後並沒有找到符合要求的數字,則不存在這樣的數字。由於列舉9個數字是否出現,所以最壞情況是\(2^9\),也就是\(1e3\)的複雜度,必然不會超時。

AC程式碼:

#include <cstdio>
#include <algorithm>

const int inf = 0x3f3f3f3f;

int main () {
    int T, x;
    scanf ("%d", &T);
    while (T--) {
        scanf ("%d", &x);
        int ans = inf;
        for (int i = 0; i < (1 << 9); i++) {
            int t = 0, s = 0;
            for (int j = 0; j < 9; j++) {
                if (i & (1 << j)) {
                    t = t + j + 1;
                    s = s * 10 + j + 1;
                }
            }
            if (t == x) {
                ans = std::min(ans, s);
            }
        }
        printf ("%d\n", ans == inf ? -1 : ans);
    }
    return 0;
}