一、题意
一堆学生要申请换学院。
有若干组数据。
每组第一行表示申请个数。
之后每一行为两个数(A, B),表示这个人想从A换到B学院。
如果同时存在一对(A,B)和(B,A)则这两个人可以交换。
求最终所有人能否交换成功。
二、解析
用一个map来存储信息,比如当有(A,B)申请时, 将(A, B)在map中+1,然后当有一个(B,A)申请时,再将(A, B)在map中-1,表示抵消。最终看是否能完全抵消即可。
可用A,B的大小关系来区分是正标记还是负抵消。
三、代码
#include <iostream>
#include <map>
#define mp make_pair
using namespace std;
map<pair<int, int>, int> flag;
int n;
int main() {
while(cin >> n && n) {
flag.clear();
while(n --) {
int x, y;
cin >> x >> y;
if(x < y) flag[mp(x, y)] ++;
else flag[mp(y, x)] --;
}
bool ok = 1;
for(auto p : flag) if(p.second != 0) {
ok = 0;
break;
}
cout << (ok ? "YES" : "NO") << endl;
}
}四、归纳
- 简单题,不过发现map在C++11已经可以直接for(auto x: x_map)来遍历,倒是个挺方便的写法

京公网安备 11010502036488号