PAT乙级 1065 单身狗题目

1065. 单身狗(25)

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

输入格式:

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

输出格式:

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

输入样例:
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
输出样例:
5
10000 23333 44444 55555 88888
 
 
解题分析
解题关键是寻找夫妻伴侣对同时存在参加派对队伍中的对数。关键函数为数组中的find函数。
用法实例
int temp[100]={3,4,2,1}
find(temp,temp+100,1)//返回找到的内存地址,取* 可以重新赋值如 temp[3]=1;*find(temp,temp+100,1)=2;此时temp[3]=2;//如找不到 *find(temp,temp+100,1)==0 

代码
#include<iostream>
#include<string>
#include <algorithm> 
#include<iomanip>
using namespace std;

int main()
{
	int n,m; //题目的N,M 
	cin>>n;
	int id[50000][2]={}; //定义二维数组存夫妻伴侣对编号。 
	int couples=0;  //参加派对的夫妻对数。 
	for(int i=0;i<n;i++) //输入已知的夫妻伴侣ID,成对输入。 
	{
		do
		{
			cin>>id[i][0]>>id[i][1];
		}while(getchar()!='\n');
	}
	
	cin>>m;
	int *peopleid=new int [m]; //定义动态一维数组存参加派对的人员编号。 
	for(int i=0;i<m;i++)
		cin>>peopleid[i];	
	for(int i=0;i<n;i++) //循环查找, id[i][0]和 id[i][1]同时存在 
	{
		if((*find(peopleid,peopleid+m,id[i][0])==id[i][0])&&(*find(peopleid,peopleid+m,id[i][1])==id[i][1]))//关键代码
		{
				couples++;
				*find(peopleid,peopleid+m,id[i][0])=1000000;  //将存在的夫妻编号赋值1000000,控制不输出。 
				*find(peopleid,peopleid+m,id[i][1])=1000000;		
		}
	}
	sort(peopleid,peopleid+m);	//排序,题目要求从小到大 
	cout<<m-couples*2<<endl; //落单人数	
	if(m-couples*2!=0)
	{
		cout<<setiosflags(ios::right)<<setfill('0')<<setw(5)<<peopleid[0];//控制输出	
		for(int i=1;i<m;i++)
		{
		if(peopleid[i]!=1000000)
			cout<<' '<<setw(5)<<peopleid[i];
		else
			break;
				
		}
		
	}
	delete [] peopleid;

	
	return 0;
}


 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值