PAT 1065 單身狗

題目鏈接單身狗
思路:定義兩個數組cp1,cp2,cp1中下標對應伴侶1的ID,裏面存儲伴侶2的ID,同理cp2。在定義3個數組c1,c2與single,c1(c2)用於標記當前輸入ID是伴侶1(伴侶2)的ID。single用於記錄落單的ID。隨後,一個for循環分別判斷伴侶1(或伴侶2)是否都參加聚會。
題外話:第一次,直接按照題目要求一步步判斷,寫了3層for循環時間複雜度直接成了O(n^3);第二次,用了結構體,2層for循環,還超時;最後,就想着,想要再去一層for循環,就不能遍歷數組,這樣只能把ID當做下標,可以直接查詢而不用在遍歷 這樣不再超時了,但測試點1錯誤。檢查,發現數組初始化是0,而ID是有0的,在判斷是否是一對夫妻時不能與0比較,應用cp1[i]==cp2[cp1[i]]這樣比較。這也是將伴侶1個ID當下標和存儲1個ID關聯的原因,否則,就得初始化爲其他數。(標黃爲錯誤)
在這裏插入圖片描述

AC代碼

#include<iostream>
#include<algorithm> 
using namespace std;
int main(){
	int N,M;
	cin>>N;
	int cp1[99999]={0},cp2[99999]={0};//cp1下標對應伴侶1的ID 存儲伴侶2的ID 
	for(int i=0;i<N;i++) {
		int num1,num2;
		cin>>num1>>num2;
		cp1[num1]=num2;
		cp2[num2]=num1; 
	}
	cin>>M;
	int s=0,single[M];//single落單ID s落單人數 
	int c1[99999]={0},c2[99999]={0};//c1存儲輸入ID是伴侶1的ID
	for(int i=0;i<M;i++){
		int ID; cin>>ID;
		if(cp1[ID]!=cp2[cp1[ID]]) {c1[ID]=1; continue;}
		if(cp2[ID]!=cp1[cp2[ID]]) {c2[ID]=1; continue;}
		single[s++]=ID;//在cp1與cp2中無 則單身 
	} 
	for(int i=0;i<=99999;i++){
		if(c1[i]!=0){
			if(c2[cp1[i]]==0) single[s++]=i;
		}
		if(c2[i]!=0){
			if(c1[cp2[i]]==0) single[s++]=i;
		}
	} 
	cout<<s<<endl;
	sort(single,single+s);
	for(int i=0;i<s;i++){
		if(i!=0) cout<<" ";
		printf("%05d",single[i]);
	} 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章