思维题,贪心
http://codeforces.com/contest/1606/problem/C
题意
有 \(n\) 种面值分别为 \(10^{a_i}\) 的纸币,问用小于等于 \(k\) 张纸币不能表示的最小的数是多大
Tutorial
考虑相邻的面值,如果比100小的只有1,那么它们之间就差了 99 张,所以每要涨一张,就需要相差的数。
\(k\) 张不能表示的最小的数等价于 \(k+1\) 张能表示的最小的数,因此直接对 \(k+1\) 张贪心地求出每张分配。
点击查看代码
int a[N];
int main() {
int T;
cin >> T;
ll n, k;
while (T--) {
int n, k;
cin >> n >> k;
k++;
for (int i = 0; i < n; i++) {
cin >> a[i];
int cur = 1;
while (a[i]--) cur *= 10;
a[i] = cur;
}
ll res = 0;
for (int i = 0; i < n; i++) {
int cnt = k;
if (i + 1 < n) cnt = min(cnt, a[i + 1] / a[i] - 1);
res += a[i] * 1ll * cnt;
k -= cnt;
}
cout << res << '\n';
}
return 0;
// ll a = (n - base) % k == 0 ? (n - base) / k : (n - base) / k +
// 1;ll(ceil(1.0*(n-base) / k))
}