您的位置:首页 > 其它

pat乙级1065. 单身狗(25)

2018-03-31 13:49 267 查看

1065. 单身狗(25)

时间限制300 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者CHEN, Yue
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。输入格式:输入第一行给出一个正整数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

算法设计:

由于ID号都在00000~99999之间,可以定义一个长度为10^5的一维数组hashTable,数组下标表示ID号,数组元素表示对应的配偶的ID号,没有配偶的数组元素设置为-1 。另外定义一个set,在输入M位客人的过程中,如果该客人没有配偶,直接将ID号加入set中,如果有配偶,在set中查找是否包含其配偶的ID,如果不包含,将该客人的ID号加入set中;如果包含,在set中删除其配偶的ID 。最后set中储存的就是落单的客人,输出即可。

c++代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=1e5;
int hashTable[INF];//辅助数组
int main() {
int N;
scanf("%d",&N);
memset(hashTable,-1,sizeof(hashTable));//将hashTable初始化为-1
while(N--){
int a,b;
scanf("%d%d",&a,&b);
hashTable[a]=b;
hashTable[b]=a;
}
scanf("%d",&N);
set<int>s;
while(N--){
int a;
scanf("%d",&a);
if(hashTable[a]==-1)//如果该客人没有配偶
s.insert(a);//直接将ID号加入set中
else{
auto i=s.find(hashTable[a]);//在set中查找是否包含其配偶的ID
if(i==s.cend())//不包含其配偶的ID
s.insert(a);//直接将ID号加入set中
else//包含其配偶的ID
s.erase(i);//在set中删除其配偶的ID
}
}
//输出
printf("%d\n",s.size());
for(auto i=s.cbegin();i!=s.cend();++i)
printf("%s%05d",i==s.cbegin()?"":" ",*i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: