1. 程式人生 > 其它 >Educational Codeforces Round 116 (Rated for Div. 2), problem: (C) Banknotes

Educational Codeforces Round 116 (Rated for Div. 2), problem: (C) Banknotes

傳送門Problem - C - Codeforces

題目

題目重點內容手打翻譯:(歡迎批評指正)

在柏林, 使用著n套不同的貨幣(banknotes)。第i個貨幣面額為10ai元,貨幣的第一種只能是1定義f(s)為需要s元的最小貨幣數量,例如貨幣面額分別為1,10,100,然後f(59) = 14 :因為 九個面額1元的貨幣和五個面額10元的貨幣,也就是9*1+5*10=59元,並且沒有辦法使用更少的貨幣數量

思路

儘量選擇小面值的, 還不能被其它貨幣代替的, 也就是10ai+1 -10ai- 1, 題目樣例很良心, 可以猜出來, 部分解釋在程式碼裡

AC程式碼

#include <iostream>
#include 
<algorithm> using namespace std; typedef long long LL; const int N = 1e6; LL money[15]; int a[20]; void init() { money[0] = 1;//money是10的i次方 for(int i = 1; i <= 10; i ++) money[i] = money[i-1]*(LL)10; } int main(){ int t, n, k; init(); cin >> t; while(t --) { cin
>> n >>k; k ++;//k是貨幣數量, +1因為最後要讓他k個貨幣無法達到這些錢(res) for(int i = 0; i < n; i ++) cin >> a[i]; sort(a, a+n); LL res = 0; for(int i = 0; i < n; i ++) { if(i == n-1){//特判, 多寫點這些就不用考慮最後了 res += (LL)k * money[a[i]];
break; }

        //chaju就是差距,比如1和10差9,1和100差99,代表本回合最多能加多少個a[i] LL chaju
= 0, tt = a[i+1]-a[i]; chaju = money[tt] - 1; if(k > chaju){ k -= chaju; res += (LL)chaju * money[a[i]]; } else{ res += (LL)k * money[a[i]]; break; } } cout << res <<endl; } return 0; }