熱門文章

2026年2月4日 星期三

ZeroJudge 解題筆記:c036. 00573 - The Snail

作者:王一哲
日期:2026年2月4日


ZeroJudge 題目連結:c036. 00573 - The Snail

解題想法


用 $y$ 儲存目前的高度,預設值為 0。用一個無窮迴圈,不斷更新每天的高度,更新的順序為
  1. 白天往上爬高度 $u$,如果 $y > h$ 印出 success on day {days},中止迴圈。
  2. 晚上向下滑高度 $d$,如果 $y < 0$ 印出 failure on day {days},中止迴圈。
  3. 更新下一天向上爬的高度 $u$,如果 $u < 0$ 時歸零。


Python 程式碼


使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
import sys

for line in sys.stdin:
    if line.rstrip() == "0 0 0 0": break
    h, u, d, f = map(float, line.split())
    days = 0
    dec = u*f*0.01
    y = 0.0
    while True:
        days += 1
        y += u
        if y > h:
            print(f"success on day {days:d}")
            break
        y -= d
        if y < 0:
            print(f"failure on day {days:d}")
            break
        u -= dec
        if u < 0: u = 0.0


C++ 程式碼


使用時間約為 2 ms,記憶體約為 88 kB,通過測試。
#include <cstdio>

int main() {
    int hi, ui, di, fi;
    float h, u, d, f;
    while(scanf("%d %d %d %d", &hi, &ui, &di, &fi) != EOF) {
        if (hi == 0 && ui == 0 && di == 0 && fi == 0) break;
        h = (float)hi; u = (float)ui; d = (float)di; f = (float)fi;
        int days = 0;
        float dec = u*f*0.01, y = 0.0;
        while(true) {
            days++; y += u;
            if (y > h) {
                printf("success on day %d\n", days);
                break;
            }
            y -= d;
            if (y < 0) {
                printf("failure on day %d\n", days);
                break;
            }
            u -= dec;
            if (u < 0) u = 0.0;
        }
    }
    return 0;
}


沒有留言:

張貼留言