题面
思路分析
每个学生可以看作一个pair<int A,int B>,每次读入一个学生后之后查询当前数据库中是否存在一个学生能与之交换(即数据库中存在pair<B,A>),若存在,则读入的学生不进入数据库,并将与之配对的学生从数据库中删除;若不存在,则该学生进入数据库。
最后,遍历一遍检查数据库是否为空(学生数量均为0)即可。
数据库可以使用一个从pair到int的映射实现,int表示该种学生在数据库内的数量。
代码实现
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<stdio.h>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
map<pair<int,int>,int> p;
if(n==0) return 0;
int a,b;
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
pair<int,int> stu;
stu=make_pair(b,a);
if(p.count(stu)!=0&&p[stu]>0){//是否存在可以与该学生交换的人选
p[stu]--;//存在,将该人选从数据库中移除
}
else{//不存在,将该学生插入数据库中
stu=make_pair(a,b);
if(p.count(stu)==0){
p[stu]=1;
}
else p[stu]++;
}
}
int ok=true;
for(map<pair<int,int>,int>::iterator it=p.begin();it!=p.end();it++){//遍历map
if(it->second>0){//是否有剩余的学生没有进行配对
ok=false;
break;
}
}
if(ok) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
知识点
检查map中是否存在一个key:.count(...)为1则存在,为0则不存在。
遍历map的方法:如下,即"迭代器->first/second"来分别读取key/value。
for(map<pair<int,int>,int>::iterator it=p.begin();it!=p.end();it++){//遍历map
if(it->second>0){//是否有剩余的学生没有进行配对
ok=false;
break;
}
}