题目链接单身狗
思路:定义两个数组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;
}