# Array# Sorting# Greedy# Set

d045 - 11222 - Only I did it!

🔗 前往 ZeroJudge 原題

題目描述

題目描述了三個朋友各自解了一些題目,要求找出哪位朋友解的題目數量最多,且這些題目是其他兩位朋友都未曾解過的。如果有多位朋友解的題目數量相同,則按照編號順序輸出。

解題思路

解題思路是分別統計每位朋友獨自解出的題目數量。具體步驟如下:

  1. 讀取三位朋友各自解出的題目,並使用布林陣列 ta, tb, tc 記錄每個題目是否被對應的朋友解過。
  2. 對每位朋友解出的題目進行排序,以便更容易地查找。
  3. 遍歷每位朋友解出的題目,檢查該題目是否被其他兩位朋友解過。如果沒有,則將該題目計入該朋友的獨自解出的題目數量。
  4. 找出獨自解出的題目數量最多的朋友,並輸出其編號、數量以及獨自解出的題目列表。如果有多位朋友數量相同,則按照編號順序輸出。

複雜度分析

  • 時間複雜度: O(N * M + M log M),其中 N 是每位朋友解出的題目數量,M 是題目範圍 (10000)。排序佔據 O(M log M),遍歷和查找佔據 O(N * M)。
  • 空間複雜度: O(M),主要用於儲存布林陣列 ta, tb, tc

程式碼

#include <bits/stdc++.h>
using namespace std;
int t,a[1005],b[1005],c[1005],na,nb,nc;
bool ta[10005],tb[10005],tc[10005];
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> t;
	for(int ca=1;ca<=t;++ca){
		memset(ta,0,sizeof(ta));
		memset(tb,0,sizeof(tb));
		memset(tc,0,sizeof(tc));
		cin >> na;
		int sa=0,sb=0,sc=0,ma=0;
		for(int i=0;i<na;++i){
			cin >> a[i];
			ta[a[i]]=1;
		}
		cin >> nb;
		for(int i=0;i<nb;++i){
			cin >> b[i];
			tb[b[i]]=1;
		}
		cin >> nc;
		for(int i=0;i<nc;++i){
			cin >> c[i];
			tc[c[i]]=1;
		}
		sort(a,a+na);
		sort(b,b+nb);
		sort(c,c+nc);
		for(int i=0;i<na;++i){
			if(!tb[a[i]]&&!tc[a[i]])++sa;
		}
		for(int i=0;i<nb;++i){
			if(!ta[b[i]]&&!tc[b[i]])++sb;
		}
		for(int i=0;i<nc;++i){
			if(!ta[c[i]]&&!tb[c[i]])++sc;
		}
		ma=max(sa,max(sb,sc));
		cout << "Case #" << ca << ":\n";
		if(ma==sa){
			cout << "1 " << ma;
			for(int i=0;i<na;++i){
				if(!tb[a[i]]&&!tc[a[i]])cout << " " << a[i];
			}
			cout << "\n";
		}
		if(ma==sb){
			cout << "2 " << ma;
			for(int i=0;i<nb;++i){
				if(!ta[b[i]]&&!tc[b[i]])cout << " " << b[i];
			}
			cout << "\n";
		}
		if(ma==sc){
			cout << "3 " << ma;
			for(int i=0;i<nc;++i){
				if(!ta[c[i]]&&!tb[c[i]])cout << " " << c[i];
			}
			cout << "\n";
		}
	}
}

Discussion