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