熱門文章

2025年5月7日 星期三

ZeroJudge 解題筆記:k848. P2.卡牌評分 (Card)

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



ZeroJudge 題目連結:k848. P2.卡牌評分 (Card)

解題想法


分成兩個部分,先掃過全部的卡牌資料並找最大值,再掃一輪計算每張牌的積分。

Python 程式碼


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

for line in sys.stdin:
    n = int(line)  # n 張卡牌
    S, A, D, H = [0]*n, [0]*n, [0]*n, [0]*n  # 積分,攻擊力,防禦力,生命力
    amax, dmax, hmax = 0, 0, 0  # 最高攻擊力,最高防禦力,最高生命力
    for i in range(n):  # 讀取 n 張牌的資料並找最大值
        a, d, h = map(int, input().split())
        A[i] = a; amax = max(amax, a)
        D[i] = d; dmax = max(dmax, d)
        H[i] = h; hmax = max(hmax, h)
    for i in range(n):  # 計算每張牌的積分
        if A[i] == amax: S[i] += 1
        if D[i] == dmax: S[i] += 1
        if H[i] == hmax: S[i] += 1
    print(S.index(max(S)) + 1)  # 印出最高積分卡牌編號


C++ 程式碼


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

int main() {
    int n;  // n 張卡牌
    while(scanf("%d", &n) != EOF) {
        int S[n] = {0}, A[n], D[n], H[n];  // 積分,攻擊力,防禦力,生命力
        int amax = 0, dmax = 0, hmax = 0;  // 最高攻擊力,最高防禦力,最高生命力
        for(int i=0; i<n; i++) {  // 讀取 n 張牌的資料並找最大值
            int a, d, h; scanf("%d %d %d", &a, &d, &h);
            A[i] = a; amax = max(amax, a);
            D[i] = d; dmax = max(dmax, d);
            H[i] = h; hmax = max(hmax, h);
        }
        for(int i=0; i<n; i++) {  // 計算每張牌的積分
            if (A[i] == amax) S[i]++;
            if (D[i] == dmax) S[i]++;
            if (H[i] == hmax) S[i]++;
        }
        printf("%ld\n", max_element(S, S+n) - S + 1);  // 印出最高積分卡牌編號
    }
    return 0;
}


沒有留言:

張貼留言