1065 单身狗 (25 分)

题目描述:

单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

输入格式:

输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。

 输入样例:

1065 单身狗 (25 分)

输出格式:

首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。

 输出样例:

1065 单身狗 (25 分)

分析: 首先这道题思路很简单:如果参加派对的人没有伴侣或者伴侣不在派对,那么这个人id就是要输出的。设置一个数组arr1:arr1[i]=j表示i的伴侣为j,相应地设置arr1[j]=i。设置数组arr2,arr2[i]=1表示id为i的人在派对,为0表示不在。
遍历所有id(0-99999),找出arr1[i] == -1或者arr1[i]!=-1但arr2[arr1[i]]==0的所有id输出即可。

题目思路很容易想到,但有一些地方要注意。

  • id为00000~00009的输出时要注意格式(输出格式用%05d)。
  • 00000也是一个id,如果初始化arr1时按照习惯为0就错了(会导致一些样例点错误)。因为arr1[i]==0不能表示i没有伴侣,可能i的伴侣id为00000。所以可以初始化arr1为-1。

代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
	int i, n, m, t1, t2;
	vector<int> vec, arr1(100000,-1), arr2(100000,0);
	cin>>n;
	for(i = 0; i < n; i++){
		cin>>t1>>t2;
		arr1[t1] = t2;
		arr1[t2] = t1;
	} 
	cin>>m;
	for(i = 0; i < m; i++){
		cin>>t1;
		arr2[t1] = 1;
	}
	for(i = 0; i < 100000; i++){
		if(arr2[i] == 1){
			if(arr1[i] == -1 || (arr1[i] != -1 && arr2[arr1[i]] == 0))
				vec.push_back(i);
		} 
	}
	cout<<vec.size()<<endl;
	sort(vec.begin(), vec.end());
	for(i = 0; i < vec.size(); i++){
		if(i == 0)
			printf("%05d",vec[i]);
		else
			printf(" %05d",vec[i]);
	}
	return 0;
} 






上一篇:字符串拷贝函数strcpy的实现


下一篇:数组的赋值和拷贝