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
【解析】
这道题是乙级的最后一道题,本题目的意思就是输出单个来的,成对的就不用输出了,刚刚做这道题的时候本来想用数组,写到一半发现写不下去了,之后突然想到结构体好像也可以所以之前做的时候是用结构体做的做了结果时间超时,改了很久也没改好,之后看了大佬的一道题的做法,发现数组做的话比较简单时间复杂度和空间复杂度都比我的小。首先先定义两个数组a和b,b数组里面存储自己的老婆或者老公是谁,然后输入来的人数,和来的人的编号,这里需要用到两个标记,a数组中存储如果A来了就给他赋值1,输入顺序是从前往后,先暂时给A的对象赋-1,如果A的对象来了就给A赋0表示他已经不是单身狗了。A数组的值其实就是只有0,1,-1如果A数组元素的值为1就表示是单身狗了。
#include <iostream> #include <cmath> #include<cstdio> using namespace std; int main(){ int N; cin>>N; int i; int a[100000]={0}; int b[100001]={100000}; int A,B; for(i=0;i<N;i++){ scanf("%d %d",&A,&B); b[A]=B; b[B]=A; } int count=0; int M; cin>>M; for(i=0;i<M;i++){ cin>>A; if(a[A]==0){ count++; a[A]=1; a[b[A]]=-1; } else if(a[A]==-1){ a[b[A]]=0; count--; } } int flag=0,j=0; cout<<count<<endl; for(i=0;j<count;i++){ if(a[i]==1){ if(flag==0) flag=1; else cout<<" "; printf("%05d",i); j++; } } }