熱門文章

2025年10月16日 星期四

ZeroJudge 解題筆記:f634. 士兵歸來

作者:王一哲
日期: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;
}
}


沒有留言:

張貼留言