前往
大廳
主題

ZeroJudge - f815: TOI_y21m4_a01遊戲升等 解題心得

Not In My Back Yard | 2021-05-20 00:00:09 | 巴幣 0 | 人氣 434

題目連結:


題目大意:
輸入第一列給定兩正整數 N 、 C (1 ≦ N ≦ 2 × 10 ^ 4 , 1 ≦ C ≦ 10 ^ 14),代表小明有 N 位士兵且有 C 枚金幣。接著第二列輸入有 N 個整數,代表 N 位士兵的等級。

假設原本一位士兵的等級為 X ,當他要升級到等級 L 時需要消耗掉 (L - X) ^ 2 枚的金幣。

當等級最低的士兵之等級為 K 時,則小明可以參加等級 K 的競賽。

試問使用金幣升級士兵的情況下,最高可以參加到幾等的競賽?



範例輸入:
範例輸入 #1
3 10
2 4 6

範例輸入 #2
6 267
25 39 36 17 20 39

範例輸入 #3
1 100000000000000
10000000


範例輸出:
範例輸出 #1
5

範例輸出 #2
29

範例輸出 #3
20000000


解題思維:
可以參見這題的想法——將「答案」作為二分搜尋法(Binary Search)的對象。

設定一開始答案的下界為 L = 0 、上界為 U = 20000001(因為 20000000 是一個士兵的等級之極限),則二分的迭代式為:

令 M = (L + U) ÷ 2 ,如果 M 這個值可以達到(根據題目的需求),則提高下界 → 令 L = M ;反之,如果 M 是不可能的解,則降低上界 → U = M 。

而檢查 M 可不可行的方式就是掃過所有士兵的等級,將所有 < M 的士兵使用金幣達到等級 M 。當金幣不夠用時,就代表將所有士兵提升到至少為等級 M 是不可行的。




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

創作回應

更多創作