PAT乙级1065
“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。
输入格式:
输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 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
1 #include<bits/stdc++.h> 2 #define maxn 100005 3 using namespace std; 4 5 int main() 6 { 7 int ans=0; 8 map<int,int>mp; 9 set<int> s; 10 set<int>::iterator it; 11 int n; 12 cin>>n; 13 for(int i=1;i<=n;i++) 14 { 15 int a,b; 16 cin>>a>>b; 17 mp.insert(make_pair(a,b)); 18 mp.insert(make_pair(b,a)); 19 } 20 cin>>n; 21 int b[n]; 22 for(int i=0;i<n;i++) 23 { 24 cin>>b[i]; 25 } 26 int t; 27 for(int i=0;i<n;i++){ 28 int flag=1; 29 if(mp.find(b[i])!=mp.end()) 30 { 31 t=mp[b[i]]; 32 flag=0; 33 } 34 if(flag) 35 s.insert(b[i]); 36 else{ 37 for(int j=0;j<n;j++) 38 if(b[j]==t) 39 {ans++; 40 flag=1; 41 break; 42 } 43 if(!flag) 44 s.insert(b[i]); 45 } 46 } 47 cout<<n-ans<<endl; 48 for(it=s.begin();it!=s.end();it++) 49 if(it==s.begin()) 50 printf("%05d",*it); 51 else 52 printf(" %05d",*it); 53 return 0; 54 }
思路:
把夫妻/伴侣存入map中,把参加派对的人存入数组中,如果参加派对的人不在map中,将值插入set;如果参加派对的人在map中但是与她对应的人不在数组里,将值插入set。
遍历set并输出。