2025年11月7日 星期五

ZeroJudge 解題筆記:g489. 社團點點名

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


ZeroJudge 題目連結:g489. 社團點點名

解題想法


題目說明有問題,測資中有不在社團名單裡的出席者,所以答案有可能是負的。用集合 members 儲存社團成員學號,再用另一個集合 present 儲存非社團成員但有出席的人,最後將兩者的數量相減即可。

Python 程式碼


使用時間約為 44 ms,記憶體約為 3.6 MB,通過測試。
m, n = map(int, input().split())  # 社團人數 m,有到的人數 n
members = set([input() for _ in range(m)])  # 社團成員學號
present = set()  # 非社團成員但有出席的人
for _ in range(n):  # 讀取 n 行資料
    s = input()  # 學號
    if s in members: members.remove(s)  # s 是社團成員,從 members 移除 s
    else: present.add(s)  # s 不是社團成員,s 加入 present
print(len(members) - len(present))


C++ 程式碼


使用時間約為 6 ms,記憶體約為 476 kB,通過測試。
#include <iostream>
#include <string>
#include <set>
using namespace std;

int main() {
    int m, n; cin >> m >> n;  // 社團人數 m,有到的人數 n
    set<string> members, present;  // 社團成員學號,非社團成員但有出席的人
    for(int i=0; i<m; i++) {  // 讀取 m 行資料
        string s; cin >> s;
        members.insert(s);
    }
    for(int i=0; i<n; i++) {  // 讀取 n 行資料
        string s; cin >> s;
        if (members.count(s) == 1) members.erase(s);  // s 是社團成員,從 members 移除 s
        else present.insert(s);  // s 不是社團成員,s 加入 present
    }
    cout << (int)members.size() - (int)present.size() << "\n";
    return 0;
}


沒有留言:

張貼留言