日期:2025年10月16日
ZeroJudge 題目連結:f634. 士兵歸來
解題想法
我用集合 uni 儲存存活者的姓名、軍種、階級,再用另外兩個陣列 services、ranks 儲存各軍種、階級存活者的數量,用 cnt 儲存存活者總數。讀取 m 行資料之後,再依照題目要求的格式輸出答案。
Python 程式碼
使用時間約為 3.9 s,記憶體約為 114.5 MB,通過測試。
n, m = map(int, input().split()) # 共派出 n 人,有 m 行資料
uni = set() # (姓名 name, 軍種 service, 階級 rank)
services = [0]*4 # 海、陸、空軍存活人數,開頭有用不到的 0
ranks = [0]*4 # 軍官、士官、士兵存活人數,開頭有用不到的 0
cnt = 0 # 存活人數
for _ in range(m): # 執行 m 次
data = tuple(input().split())
if data not in uni: # 這筆資料組合不在 uni 之中,新的存活者
uni.add(data) # data 加入 uni
cnt += 1 # 存活人數加 1
services[int(data[1])] += 1 # 對應的軍種人數加 1
ranks[int(data[2])] += 1 # 對應的階級人數加 1
print(f"navy:{services[1]:d} army:{services[2]:d} air:{services[3]:d}")
print(f"officer:{ranks[1]:d} sergeant:{ranks[2]:d} soldier:{ranks[3]:d}")
print(f"survival rate: {100.0*cnt/n:.1f}%")
C++ 程式碼
使用時間約為 1.5 s,記憶體約為 49.7 MB,通過測試。
#include <iostream>
#include <string>
#include <set>
#include <iomanip>
using namespace std;
struct Soldier {
string name;
int service, rank;
// 重載比較運算符
bool operator<(const Soldier& other) const {
if (name != other.name) return name < other.name;
if (service != other.service) return service < other.service;
return rank < other.rank;
}
};
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m; cin >> n >> m; // 共派出 n 人,有 m 行資料
set<Soldier> uni; // (姓名 name, 軍種 service, 階級 rank)
int services[4] = {0}, ranks[4] = {0}, cnt = 0; // 海、陸、空軍存活人數,軍官、士官、士兵存活人數,開頭有用不到的 0,存活人數
for(int i=0; i<m; i++) { // 執行 m 次
Soldier soldier;
cin >> soldier.name >> soldier.service >> soldier.rank;
if (uni.count(soldier) != 1) { // 這筆資料組合不在 uni 之中,新的存活者
uni.insert(soldier); // soldier 加入 uni
cnt++; // 存活人數加 1
services[soldier.service]++; // 對應的軍種人數加 1
ranks[soldier.rank]++; // 對應的階級人數加 1
}
}
cout << "navy:" << services[1] << " army:" << services[2] << " air:" << services[3] << "\n";
cout << "officer:" << ranks[1] << " sergeant:" << ranks[2] << " soldier:" << ranks[3] << "\n";
cout << "survival rate: " << fixed << setprecision(1) << 100.0*cnt/n << "\%\n";
return 0;
}
}
沒有留言:
張貼留言