CF1567D Expression Evaluation Error

CF1567D Expression Evaluation Error

一道水贪心.

显然, 我们把十进制转化成十一进制之后尽量不要进位, 因为我们本来一个 \(10\) 在十进制就是 \(10\) , 不拆的话到了十一进制就是十进制下的 \(11\) , 但如果拆了, 那就是十进制下的 \(10\) 了.

所以我们先按照位数拆, 把每一位拆成不同的 \(1\) .

如果 \(1\) 的个数够, 直接输出前 \(n - 1\)\(1\) , 剩下的数加和输出, 不用担心进位问题, 因为我们把每一位都拆了, 所以每一位上 \(1\) 的个数不超过 \(9\) 个.

如果不够, 那我们就拆, 从 \(> 1\) 的最小的 \(10\) 的次幂开始拆, 这样能保证我们亏的最少, 把 \(10^k\) 拆成 \(10\)\(10^{k - 1}\) , 直到 \(1\) 的数量够, 然后按照上面输出就行了.

\(code:\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
int s, n;
priority_queue <int, vector <int>, greater <int> > q;
int main() {
    int T = read();
    while (T--) {
        s = read(), n = read();
        while (q.size()) q.pop();
        for (int tmp = s, num = 1; tmp; tmp /= 10, num *= 10) {
            int x = tmp % 10;
            for (int i = 1; i <= x; i++) q.push(num);
        }
        while (n > q.size()) {
            int x = q.top(); q.pop();
            while (x == 1) {
                printf("1 ");
                x = q.top(); q.pop(); n--;
            }
            x /= 10;
            for (int i = 1; i <= 10; i++) q.push(x);
        }
        int x = 0;
        for (int i = 1; i < n; i++) {
            x = q.top(); q.pop();
            printf("%d ", x);
        }
        x = 0;
        while (q.size()) {
            x += q.top();
            q.pop();
        }
        printf("%d\n", x);
    }
    return 0;
}
posted @ 2021-09-07 16:40  sshadows  阅读(25)  评论(0编辑  收藏  举报