问题描述
找出参加派对中单身的人数和编号,如果此人有伴侣但是伴侣并未到场也算单身。
题目分析
我觉得这个题目主要是考察我们那几个重要的stl容器的基本操作。我们首先先要知道有伴侣的人伴侣是谁。这个就需要用到map来存储,存储每个人的伴侣。
随后我们输入参加派对的人,将这些让入set集合中,为什么呢?因为set可以避免重复而且可以自动排序
我们将所有的参加人员加入set中,然后遍历这些人,在map中查找其伴侣是否出现在set中,未出现说明其伴侣没有来参加派对,将这个人的编号加入另一个结果set中。如果压根在map中就没有这个人,则也可以直接加入了。
另外set与map的搜索方式是一样的,如果搜索不到就会有set.find(id) == set.end()
最后我们通过迭代器将单身人员编号输出即可。
代码
#include <map>
#include <set>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=11000;
int a[N];
int b[N];
int main()
{
map<int,int > mp; //让情侣的编号相互对应
//set具有自动排序的功能且数据保证唯一
set<int > s; //存来参加的人数
set<int > p; //存单身的人数
int n,i,m,j=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
mp[x]=y; //让情侣的编号相互对应
mp[y]=x;
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
{
s.insert(a[i]); 存来参加的人数
}
}
for(i=0;i<m;i++)
{
int A=mp[a[i]];
if(s.find(A)==s.end()) //如果其情侣在集合中没找到
{
p.insert(a[i]); //放到新的集合中
}
else
{
continue;
}
}
cout<<p.size()<<endl; //输出单身的个数
set<int >::iterator it;
for(it=p.begin();it!=p.end();it++)
{
if(it!=p.begin())
{
cout<<" ";
}
printf("%05d",*it);
}
return 0;
}
答题用时21min
Q65——finish√