1065. 單身狗(25)
“單身狗”是中文對於單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人,以便給予特殊關愛。
輸入格式:
輸入第一行給出一個正整數N(<=50000),是已知夫妻/伴侶的對數;隨後N行,每行給出一對夫妻/伴侶——為方便起見,每人對應一個ID號,為5位元字(從00000到99999),ID間以空格分隔;之後給出一個正整數M(<=10000),為參加派對的總人數;隨後一行給出這M位客人的ID,以空格分隔。題目保證無人重婚或腳踩兩條船。
輸出格式:
首先第一行輸出落單客人的總人數;隨後第二行按ID遞增順序列出落單的客人。ID間用1個空格分隔,行的首尾不得有多餘空格。 輸入範例:
311111 2222233333 4444455555 66666755555 44444 10000 88888 22222 11111 23333
輸出範例:
510000 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++; } }}