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;
}
看不见我看不见我看不见我