您的位置:首页 > 编程语言 > C语言/C++

PAT乙级 1065 单身狗题目

2016-12-26 10:56 471 查看


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;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT