题目翻译:
给出N对夫妇,再给出M个参加party的人,求出其中单身狗的个数并按序输出单身狗的序号。(注意若夫妇没有共同参加此party,也算作单身狗)
题解思路:
- 用map映射夫妇关系,比如一对情侣a和b,令map[a]=b,map[b]=a;
- 接着遍历参加party的人,标记参加party的且是情侣的人,若其是有妇之夫或者有夫之妇,那就令visited[ID]=1;
- 接着再遍历参加party的人,若夫妻双方都被标记过,则证明其不是单身狗。
代码:
#include<bits/stdc++.h>
using namespace std;
int N, M;
map<int, int> p;
int visited[100010];
vector<int> y,r;
int main()
{
cin >> N;
for (int i = 0;i <= 99999;i++)
p[i] = -1;
while (N--)
{
int a, b;
cin >> a >> b;
p[a] = b;
p[b] = a;
}
cin >> M;
for (int i = 0;i < M;i++)
{
int t;
cin >> t;
y.push_back(t);
if (p[t] != -1)
visited[t] = 1;
}
for (int i = 0;i < M;i++)
{
if (visited[y[i]] == 1 && visited[p[y[i]]] == 1)
continue;
else
r.push_back(y[i]);
}
sort(r.begin(), r.end());
cout << r.size() << endl;
for (int i = 0;i < r.size();i++)
{
if (i != 0)
cout << " ";
cout << setw(5)<<setfill('0')<<r[i];
}
}
坑点:
- 测试点1:由于id可能为全0,所以我们要初始化map<int,int>为-1,不能直接判断if(p[t]!=0)
- 测试点3:最后输出id时,注意不足五位的补0。