熱門文章

2025年6月9日 星期一

ZeroJudge 解題筆記:n631. 撲克 (Poker)

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


ZeroJudge 題目連結:n631. 撲克 (Poker)

解題想法


這題我用表格計數,計算 1 ~ 52 各有幾張牌,最少的張數就是完整的套牌數量。最後再完整地掃過表格,計算要補的張數。

Python 程式碼


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

for line in sys.stdin:
    n = int(line)  # n 張牌
    cnt = [0]*53  # 1 ~ 52 號各有幾張,開頭多一個 0
    for i in map(int, input().split()): cnt[i] += 1  # 讀取 n 張牌,更新 cnt[i]
    imax = max(cnt)  # 同一張牌最多的數量
    deck = min(cnt[1:])  # 有幾套完整的牌
    need = 0  # 要補幾張牌
    for i in range(1, 53):  # 依序檢查每一張牌
        need += imax - cnt[i]  # 更新 need
    print(deck, need)


C++ 程式碼


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

int main() {
    int n;  // n 張牌
    while(scanf("%d", &n) != EOF) {
        int cnt[53] = {0};  // 1 ~ 52 號各有幾張,開頭多一個 0
        for(int i=0; i<n; i++) {  // 讀取 n 張牌
            int j; scanf("%d", &j);
            cnt[j]++;  // 更新 cnt[i]
        }
        int imax = 0, deck = 10000;  // 同一張牌最多的數量,有幾套完整的牌
        for(int i=1; i<=52; i++) {
            if (cnt[i] > imax) imax = cnt[i];
            if (cnt[i] < deck) deck = cnt[i];
        }
        int need = 0;  // 要補幾張牌
        for(int i=1; i<=52; i++) {  // 依序檢查每一張牌
            need += imax - cnt[i];  // 更新 need
        }
        printf("%d %d\n", deck, need);
    }
    return 0;
}

寫法2,使用 vector, max_element, min_element,使用時間約為 3 ms,記憶體約為 288 kB,通過測試。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;  // n 張牌
    while(scanf("%d", &n) != EOF) {
        vector<int> cnt (53, 0);  // 1 ~ 52 號各有幾張,開頭多一個 0
        for(int i=0; i<n; i++) {  // 讀取 n 張牌
            int j; scanf("%d", &j);
            cnt[j]++;  // 更新 cnt[i]
        }
        int imax = *max_element(cnt.begin()+1, cnt.end());  // 同一張牌最多的數量
        int deck = *min_element(cnt.begin()+1, cnt.end());  // 有幾套完整的牌
        int need = 0;  // 要補幾張牌
        for(int i=1; i<=52; i++) {  // 依序檢查每一張牌
            need += imax - cnt[i];  // 更新 need
        }
        printf("%d %d\n", deck, need);
    }
    return 0;
}


沒有留言:

張貼留言