題目鏈接單身狗
思路:定義兩個數組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;
}