1. 程式人生 > 其它 >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))
}