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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章