本文已参与「新人创作礼」活动,一起开启掘金创作之路。
@TOC
单身狗
时间限制:0.2秒 空间限制:64M
题目描述
“”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入描述
输入第一行给出一个正整数 ,是已知夫妻/伴侣的对数;随后 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 号,为 位数字(从 到 ),ID 间以空格分隔;之后给出一个正整数 ,为参加派对的总人数;随后一行给出这 位客人的 ,以空格分隔。题目保证无人重婚或脚踩两条船。
输出描述
首先第一行输出落单客人的总人数;随后第二行按 递增顺序列出落单的客人。 间用 个空格分隔,行的首尾不得有多余空格。
样例一
输入
3
11111 22222
33333 44444
55555 66666
7
55555 44444 10000 88888 22222 11111 23333
输出
5
10000 23333 44444 55555 88888
题目分析
这是一道开心题(狗粮题),落单的客人有两种,一种是他对象没来,一种是他本身就是单身狗。
我们只需要记录每个人的对象的ID(初始值是-1,不能是0,因为有的ID是0),再记录都谁来了,就能看谁落单了。把落单的人记录下来,排个序就完事了。
注意事项
- 这道题在PTA上,不能输出连续的两个空行。所以如果没有人落单,就不能输出两次换行。所以为了方便,输出完所有的落单人士后就不再输出换行了。
- 注意ID是5位数字,小的ID需要前面补0
AC代码
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
int a[100010]; // 对象数组,没对象的都是-1(不是0)
bool came[100010]={0}; // 是否来过
int b[100010]; // 来了谁
int main()
{
memset(a, -1, sizeof(a)); // 初始化为-1
int N;
cin>>N;
while(N--)
{
int x,y;
cd(x),cd(y); // scanf
a[x]=y,a[y]=x; // x的对象是y,y的对象是x
}
cin>>N;
fi(i,0,N)
{
cd(b[i]); // scanf
came[b[i]]=true; // b[i]来了
}
vector<int>ans; // 落单人士集合
for(int i=0;i<N;i++)
{
int thisPeople=b[i]; // 这个人是b[i]
if(a[thisPeople]!=-1&&came[a[thisPeople]]); // 如果有女朋友并且女朋友来了,就不是落单
else ans.push_back(thisPeople); // 否则就是落单了
}
cout<<ans.size()<<endl; // 落单总人数
sort(ans.begin(),ans.end()); // 排序
for(int i=0;i<ans.size();i++)
{
if(i)putchar(' '); // PTA上需要控制格式
printf("%05d",ans[i]);
}
return 0;
}
同步发文于我的CSDN,原创不易,转载请附上原文链接哦~ Tisfy:letmefly.blog.csdn.net/article/det…