其他分享
首页 > 其他分享> > Educational Codeforces #116 div2 C Banknotes

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))
}

标签:Educational,cur,int,res,cnt,cin,Banknotes,++,116
来源: https://www.cnblogs.com/FushimiYuki/p/15518482.html