我的错误思路:用set 数组 将每个朋友圈分开存储,然后等待查询。
缺点:题目理解能力不足,关键信息把控不到位。!!!多练。
错误代码
#include <iostream>
#include<cmath>
#include <algorithm>
#include<vector>
#include <cstring>
#include<cmath>
#include<set>
using namespace std;
set<int> myset[100];
int arr[10000];//查表
set<int> ans;
int main()
{
int n;cin>>n;
for(int j=0;j<n;j++){
int num;cin>>num;
for(int i=0;i<num;i++){
int x; cin>>x;
myset[j].insert(x);
}
}//存储没有问题
// for(int j=0;j<n;j++){
// for(set<int>::iterator it=myset[j].begin(); it!=myset[j].end();it++){
// cout<<*it<<" ";
// }
// cout<<endl;
// }
//朋友圈检验
cin>>n; int pos=0,time=n;
while(time--){
int num; cin>>num;
int flag=1;
for(int j=0;j<n;j++)
for(set<int>::iterator it=myset[j].begin(); it!=myset[j].end();it++){
if(*it==num){
if(myset[j].size()==1) arr[pos++]=num;
else flag=0;
}
}
if(flag) arr[pos++]=num;
}
//结果输出,格式控制
int first=1;
for(int i=0;i<pos;i++){
if(ans.find(arr[i])==ans.end()){
if(first){first=0; cout<<arr[i];}
else cout<<" "<<arr[i];
}
ans.insert(arr[i]);
}
if(pos==0) cout<<"No one is handsome";
return 0;
}
AC代码:
#include <iostream>
#include <set>
using namespace std;
int main()
{
int n,t;
set<string> fri;
string id;
cin>>n;
for(int i = 0; i < n ; i++)
{
cin>>t;
if(t>=2)
{
for(int j = 0; j < t; j++)
{
cin>>id;
fri.insert(id);
}
}
else
{
cin>>id; //朋友圈为1时,略过输入,无用的信息。因为只需要从最后给出的信息判断
}
}
// for(set<string>::iterator it=fri.begin();it!=fri.end();it++)
// cout<<*it<<" ";
int c;
cin>>c; //待查询个数
set<string> look;
int judge=0;
for(int i = 0;i<c;i++)
{
cin>>id;
if(fri.find(id)==fri.end()&&look.find(id)==look.end())
{
look.insert(id);
if(judge==1)
{
cout<<" ";
}
cout<<id;
judge=1;
}
}
if(judge==0) cout<<"No one is handsome"<<endl;
return 0;
}