Educational Codeforces #116 div2 C Banknotes

思维题,贪心
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))
}
上一篇:Unity导入3D模型的过程与方法


下一篇:116. 填充每个节点的下一个右侧节点指针