切換
舊版
前往
大廳
主題

ZeroJudge - e591: 11264 - Coin Collector 解題心得

Not In My Back Yard | 2020-01-05 13:48:54 | 巴幣 0 | 人氣 292

題目連結:


題目大意:
給定一正整數 T ,代表有 T 筆測試資料,每筆佔兩列。

測資第一列給定一正整數 n (1 ≦ n ≦ 1000),代表有 n 種面額的硬幣;第二列給定 n 個正整數 C1 、 C2 、 …… 、 Cn ,代表這 n 種硬幣的面額(皆小於 1000000000)。其中, C1 <C2 < …… < Cn ,且 C1 = 1 。

現在 Sultan 從銀行領出 X 元,則銀行支付這筆錢的演算法 Withdraw(X) 如下:
Withdraw(X) {
  if (X == 0)
    return 0;
  找到滿足 Y < X 的最大硬幣面額值 Y 。
  給該顧客一枚面額 Y 的硬幣。
  Withdraw(X - Y);
}

Sultan 可以從銀行提領任意金額。試問Sultan 在一次的提領下,最多可以獲得多少種面額的硬幣?



範例輸入:
2
6
1 2 4 8 16 32
6
1 3 6 8 15 20


範例輸出:
6
4


解題思維:
觀察範例 1 3 6 8 15 20 :
先取第一個數字 1:嗯,最多就是 1 。
取前兩個數字 1 3 :最多可以獲得兩種硬幣 1 、 3 。
取前三個數字 1 3 6  :最多可以獲得三種硬幣 1 、 3 、 6。
取前四個數字 1 3 6 8  :最多可以獲得三種硬幣 1 、 3  、 8。
取前五個數字 1 3 6 8 15 :最多可以獲得四種硬幣 1 、 3  、 8 、 15。
六個數字全取 1 3 6 8 15 20 :最多可以獲得四種硬幣 1 、 3 、 8 、 20。

可以看到,掃過一次面額數列就可以得知所求。

而求法就是看先前挑的面額總值是否小於現在看的面額。如果小於,則該面額也加進挑選的行列之中;反之,將該面額替換掉上一個挑的面額。因為每次根據銀行的演算法,每次提領都會給盡量大的面額。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作