题意:有一个非营利性的国际性机构执行一项国际交换学生计画。这几年来执行得相当好,有越来越多的学生想要参与这项计画,所以现在请你来帮忙这个机构。每个提出交换学生申请的人有2项资料:他来自哪一国,他想要交换到哪一国。这个计画只有在每个学生都可以找到一个交换对象的时候才算成功。换句话说,假如有一个学生想要从A国到B国,那么一定要有另一个学生从B国到A国。如果只有50个学生提出申请,要判断这计画是否可行相当简单,然而现在最多已经有 500000个学生了。——转自http://blog.csdn.net/zju_ziqin/article/details/19489799
参考博客:http://www.cnblogs.com/staginner/archive/2011/09/20/2182774.html
分析:考虑从a到b的个数,和从b到a的个数,这俩个数是否相等,如果不相等输出NO。(不知道是否正确,因为数据较水)。
收获:map<node,int>中node要有自定义排序函数,另外p.first 代表key,p.second代表映射值,p.find()也了解了怎么应用,总之收获不小。
<span style="font-size:18px;">#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
using namespace std;
struct info{
int a,b;
bool operator < (const info &e) const{
if(a!=e.a) return e.a>a;
return e.b>b;
}
}pp,ss;
map<info,int> p;
int main(){
int n,a,b;
while(cin >>n &&n){
p.clear();
for(int i=0;i<n;i++){
cin >>pp.a>>pp.b;
p[pp]++;
}
map<info,int>::iterator it;
int ok=1;
for(it=p.begin();it!=p.end();it++){
int a=(*it).first.a;
int b=(*it).first.b;
ss.a=b;
ss.b=a;
if( p[(*it).first]!=p[ss]) {ok=0;break;}
}
if(ok) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}
</span>