Processing math: 100%

熱門文章

2025年4月25日 星期五

ZeroJudge 解題筆記:k466. 成績分析 (Analysis)

作者:王一哲
日期:2025年4月25日



ZeroJudge 題目連結:k466. 成績分析 (Analysis)

解題想法


依序比較每個人的分數變化即可。

Python 程式碼


使用時間約為 0.2 s,記憶體約為 3.4 MB,通過測試。
import sys

for line in sys.stdin:
    n, m = map(int, line.split())  # n 個人,m 個分數
    improve, drop = 0, 0  # 進步、退步名單
    imax, dmax = 0, 0  # 進步、退步分數最大值
    for i in range(1, n+1):  # 讀取座號 1 ~ n
        score = list(map(int, input().split()))  # 分數
        im, dm = 0, 0  # 這個人進步(正值)、退步的分數(負值)
        for j in range(1, m):  # 比較 score[j] - score[j-1]
            im += max(score[j] - score[j-1], 0)  # 取分差及 0 較大者加到 im
            dm += min(score[j] - score[j-1], 0)  # 取分差及 0 較小者加到 im
        if im > imax: improve = i; imax = im  # im 較大,更新 improve, imax
        if -dm > dmax: drop = i; dmax = -dm  # -dm 較大,更新 drop, dmax
    print(improve); print(drop)  # 印出答案


C++ 程式碼


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

int main() {
    int n, m;  // n 個人,m 個分數
    while(scanf("%d %d", &n, &m) != EOF) {
        int improve = 0, drop = 0, imax = 0, dmax = 0;  // 進步、退步名單,進步、退步分數最大值
        for(int i=1; i<=n; i++) {  // 讀取座號 1 ~ n
            int sp, im = 0, dm = 0;  // 前一個分數,這個人進步(正值)、退步的分數(負值)
            scanf("%d", &sp);
            for(int j=1; j<m; j++) {  // 比較 sc - sp
                int sc; scanf("%d", &sc);  // 現在的分數
                im += max(sc - sp, 0);  // 取分差及 0 較大者加到 im
                dm += min(sc - sp, 0);  // 取分差及 0 較小者加到 im
                sp = sc;  // 更新 sp 為 sc
            }
            if (im > imax) {  // im 較大,更新 improve, imax
                improve = i; imax = im;
            }
            if (-dm > dmax) {  // -dm 較大,更新 drop, dmax
                drop = i; dmax = -dm;
            }
        }
        printf("%d\n%d\n", improve, drop);  // 印出答案
    }
    return 0;
}


沒有留言:

張貼留言