2025年9月14日 星期日

ZeroJudge 解題筆記:d881. 作業苦多

作者:王一哲
日期:2025年9月14日


ZeroJudge 題目連結:d881. 作業苦多

解題想法


這題可以寫迴圈直接跑,也可以先推導數學公式之後再代公式求解。

Python 程式碼


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

for line in sys.stdin:
    d = int(line)  # 公差的增量
    dp = [0]*51  # 儲存第 0 ~ 50 項的串列
    dp[1] = 1  # 第 1 項為 1
    b = 1  # 公差,預設為 1
    isum = 1  # 加總,先加第 1 項
    for i in range(2, 51):  # 計算第 2 到 50 項
        dp[i] = dp[i-1] + b  # 第 i 項為第 i-1 項加上 b
        isum += dp[i]  # 更新 isum
        b += d  # 更新 b
    print(isum)  # 印出 isum

只要用到前一項,使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
import sys

for line in sys.stdin:
    d = int(line)  # 公差的增量
    last = 1  # 第 1 項為 1
    b = 1  # 公差,預設為 1
    isum = 1  # 加總,先加第 1 項
    for i in range(2, 51):  # 計算第 2 到 50 項
        last += b  # 第 i 項為第 i-1 項加上 b
        isum += last  # 更新 isum
        b += d  # 更新 b
    print(isum)  # 印出 isum

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

for line in sys.stdin:
    print(1275 + int(line)*19600)


C++ 程式碼


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

int main() {
    int d;  // 公差的增量
    while(scanf("%d", &d) != EOF) {
        int dp[51] = {0};  // 儲存第 0 ~ 50 項的串列
        dp[1] = 1;  // 第 1 項為 1
        int b = 1, isum = 1;  // 公差,預設為 1;加總,先加第 1 項
        for(int i=2; i<=50; i++) {  // 計算第 2 到 50 項
            dp[i] = dp[i-1] + b;  // 第 i 項為第 i-1 項加上 b
            isum += dp[i];  // 更新 isum
            b += d;  // 更新 b
        }
        printf("%d\n", isum);  // 印出 isum
    }
    return 0;
}

只要用到前一項,使用時間約為 1 ms,記憶體約為 76 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    int d;  // 公差的增量
    while(scanf("%d", &d) != EOF) {
        int last = 1, b = 1, isum = 1;;  // 第 1 項為 1;公差,預設為 1;加總,先加第 1 項
        for(int i=2; i<=50; i++) {  // 計算第 2 到 50 項
            last += b;  // 第 i 項為第 i-1 項加上 b
            isum += last;  // 更新 isum
            b += d;  // 更新 b
        }
        printf("%d\n", isum);  // 印出 isum
    }
    return 0;
}

直接代公式,使用時間約為 1 ms,記憶體約為 68 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    int d;  // 公差的增量
    while(scanf("%d", &d) != EOF) printf("%d\n", 1275 + d*19600);
    return 0;
}


沒有留言:

張貼留言