熱門文章

2025年5月19日 星期一

ZeroJudge 解題筆記:l918. P1. 彈珠汽水 (Soda)

作者:王一哲
日期:2025年5月19日



ZeroJudge 題目連結:l918. P1. 彈珠汽水 (Soda)

解題想法


這題有一個陷阱,如果 $N = 1$,每喝一瓶汽水就可以再換一瓶新的汽水,如果寫 while 迴圈的條件時只考慮是否還有沒喝的汽水,這樣會變成無窮迴圈。

Python 程式碼


使用時間約為 38 ms,記憶體約為 3.3 MB,通過測試。
m, n, k = map(int, input().split())  # m 瓶彈珠汽水,n 個瓶子再換一瓶汽水,想要喝到 k 瓶
t, b = 0, 0  # 總瓶數,空瓶數
while m > 0 and t < k:  # 如果還有沒喝的汽水而且還沒有喝到想要的瓶數
    t += m; b += m  # 更新 t, b,加上 m
    m = b//n  # 用空瓶換汽水
    b %= n  # 剩下的空瓶
print("YES" if t >= k else "NO")  # 依照 t 是否大於等於 k 印出答案


C++ 程式碼


使用時間約為 2 ms,記憶體約為 84 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    int m, n, k; scanf("%d %d %d", &m, &n, &k);  // m 瓶彈珠汽水,n 個瓶子再換一瓶汽水,想要喝到 k 瓶
    int t = 0, b = 0;  // 總瓶數,空瓶數
    while(m > 0 && t < k) {  // 如果還有沒喝的汽水而且還沒有喝到想要的瓶數
        t += m; b += m;  // 更新 t, b,加上 m
        m = b/n;  // 用空瓶換汽水
        b %= n;  // 剩下的空瓶
    }
    printf(t >= k ? "YES\n" : "NO\n");  // 依照 t 是否大於等於 k 印出答案
    return 0;
}


沒有留言:

張貼留言