传送门UVa 10763 - Foreign Exchange
题意大家都懂。
没思路。
翻了很多解题报告,都开一个500000+的数组,但我认为这是错的。
题目只是说最多有500000的人,数字只是代表地区,题目没说地区的范围。
应该用map来做。。
参考了synapse7的解题报告。
记录每一个人的意向,和数量。然后根据b和a的关系加减。。
最后的每组的数量如果全部是0,就是所有人已经配对,YES,不然就是NO。
#include <cstdio>
#include <map>
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
map<pair<int, int>, int> mp;
bool flag;
int n, i, j, a, b;
while (scanf("%d", &n), n)
{
flag = true;
mp.clear();
for (i = 0; i < n; i++)
{
scanf("%d%d", &a, &b);
if (a > b)
mp[make_pair(b, a)]--;
else
mp[make_pair(a, b)]++;
}
for (map<pair<int, int>, int>::iterator it = mp.begin(); it != mp.end(); it++)
if (it->second)
{
flag = false;
printf("NO\n");
break;
}
if (flag)
printf("YES\n");
}
return 0;
}