熱門文章

2025年5月6日 星期二

ZeroJudge 解題筆記:k847. P1.租車費用 (Rent)

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



ZeroJudge 題目連結:k847. P1.租車費用 (Rent)

解題想法


按照題目的計費規則寫就行了,先算租車天數,分成每租滿 10 天以及未滿 10 天兩個部分計費。

Python 程式碼


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

month = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
for line in sys.stdin:
    m1, d1 = map(int, line.split())  # 第一天月、日
    m2, d2 = map(int, input().split())  # 第二天月、日
    # 租車天數,先計算月份,減去 m1 月份在 d1 之前的天數,加上 m2 月份的天數,頭尾都要算天數,再加 1
    days = sum(month[m1: m2]) - d1 + d2 + 1
    fee = (days//10) * 900  # 每租滿10天算900元
    fee += (days%10) * 100  # 未滿10天的部分每天100元
    print(fee)

月份的天數改成前綴和,如果輸入的月份是 $m1, m2$,要算計算 $m2-1$ 到 $m1$ 月份的天數 $psum[m2-1] - psum[m1-1]$。使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
import sys

psum = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)
for line in sys.stdin:
    m1, d1 = map(int, line.split())  # 第一天月、日
    m2, d2 = map(int, input().split())  # 第二天月、日
    # 租車天數,先計算月份,減去 m1 月份在 d1 之前的天數,加上 m2 月份的天數,頭尾都要算天數,再加 1
    days = psum[m2-1] - psum[m1-1] - d1 + d2 + 1
    fee = (days//10) * 900  # 每租滿10天算900元
    fee += (days%10) * 100  # 未滿10天的部分每天100元
    print(fee)


C++ 程式碼


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

int main() {
    int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int m1, d1;  // 第一天月、日
    while(scanf("%d %d", &m1, &d1) != EOF) {
        int m2, d2; scanf("%d %d", &m2, &d2);  // 第二天月、日
        // 租車天數,先計算月份,減去 m1 月份在 d1 之前的天數,加上 m2 月份的天數,頭尾都要算天數,再加 1
        int days = -d1 + d2 + 1;
        for(int i=m1; i<m2; i++) days += month[i];
        int fee = (days/10) * 900;  // 每租滿10天算900元
        fee += (days%10) * 100;  // 未滿10天的部分每天100元
        printf("%d\n", fee);
    }
    return 0;
}

月份的天數改成前綴和,如果輸入的月份是 $m1, m2$,要算計算 $m2-1$ 到 $m1$ 月份的天數 $psum[m2-1] - psum[m1-1]$。使用時間約為 2 ms,記憶體約為 88 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    int psum[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
    int m1, d1;  // 第一天月、日
    while(scanf("%d %d", &m1, &d1) != EOF) {
        int m2, d2; scanf("%d %d", &m2, &d2);  // 第二天月、日
        // 租車天數,先計算月份,減去 m1 月份在 d1 之前的天數,加上 m2 月份的天數,頭尾都要算天數,再加 1
        int days = psum[m2-1] - psum[m1-1] - d1 + d2 + 1;
        int fee = (days/10) * 900;  // 每租滿10天算900元
        fee += (days%10) * 100;  // 未滿10天的部分每天100元
        printf("%d\n", fee);
    }
    return 0;
}


沒有留言:

張貼留言