日期: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;
}
沒有留言:
張貼留言