切換
舊版
前往
大廳
主題

ZeroJudge - e594: 10090 - Marbles 解題心得

Not In My Back Yard | 2020-01-08 22:30:35 | 巴幣 0 | 人氣 279

題目連結:


題目大意:
輸入有多筆測試資料。每筆第一咧給定一正整數 n (1 ≦ n ≦ 2000000000,當 n = 0 時代表輸入結束),代表有 n 個大理石。接著兩列各給定兩正整數 c1 、 n1 以及 c2 、 n2 ,代表第一種盒子成本為 c1 並可以容納 n1 個大理石、第二種盒子成本 c2 並可以容納 n2 個大理石。

試問可否有方法用這兩種盒子將 n 個大理石全數裝完且每個盒子都是滿的。如果有請輸出成本最小的所需盒子數(保證唯一),一個數字代表第一種盒子、另一個代表第二種盒子;如果不行,則輸出「failed」。



範例輸入:
43
1 3
2 4
40
5 9
5 12
0


範例輸出:
13 1
failed


解題思維:
根據擴展歐幾里得演算法(Extended Euclidean Algorithm),我們可以找到一對整數數對(X, Y)滿足以下:
n1 × X + n2 × Y = GCD(n1, n2)
因此如果 n 無法被 GCD(n1, n2) 整除,那麼一定不會有解,輸出「failed」。

接著就用擴展歐幾里得演算法(如此題中有提到)求出一對(X, Y)。而其他解的通式為
X' = X + t × (n2 ÷ GCD(n1, n2))
Y' = Y + t × (n1 ÷ GCD(n1, n2))
其中 t 為任意整數。

因此,我們可以根據上面的通式先試著分別將 X 、 Y 調整成正整數解(畢竟不能有 ≦ 0 個盒子)。如果調整失敗,代表無解,輸出「failed」。

如果以上的判斷都通過,那麼一定有最小成本的方法。接著我們就利用跟剛剛一樣的方式,將(X, Y)數對解調成令 X 盡量地大,同時也複製一份到旁邊並將該數對的 Y 調成盡量地大。然後,比較兩者的成本,看誰小就是答案。(因為是最小成本,不是盡可能地用第一種就是用第二種盒子)

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

創作回應

相關創作

更多創作