紫书 习题 5-3 uva 10763

思路:

我想将一对数映射到一个int上,结果发现不知道怎么处理这一对数。。。后来发现居然有一个pair的东西可以存一个二元组。。。

这里是关于pair的用法:http://blog.csdn.net/oceanlight/article/details/7890537

主要学习的就是pair和map的混用。。。

后来我搜了下题解发现居然还可以用分别排序,然后如果两个序列都一模一样的话,说明是YES。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define BIG 100000
using namespace std;
struct state 
{
	int x,y;
}s[1000000];
int main ()
{
	int n;
	while(cin >> n && n)
	{
		map<pair<int,int>,int> mp;   //放在这里就避免初始化。 如果放在外面的话就要用mp.clear() 
		memset(s,0,sizeof(s));
		for(int i = 0;i < n;i++)
		{
			cin >> s[i].x >> s[i].y;
			pair<int,int> p (s[i].x,s[i].y);
			mp[p]++;
		}
		int ok = 1;
		for(int i = 0 ;i < n;i++)
		{
			pair<int,int> p(s[i].x,s[i].y);
			pair<int,int> q(s[i].y,s[i].x);
			if(mp [p] != mp[q])
			{
				ok = 0;
				break;	
			}
		}
		if(ok) cout << "YES\n";
		else cout << "NO\n";
	}
	return 0;
}

用排序

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int s[1000000];
int a[1000000];
int main ()
{
	int n;
	while(cin >> n && n)
	{
		memset(a,0,sizeof(a));
		memset(s,0,sizeof(s));
		for(int i = 0 ;i < n;i++)
		cin >> s[i] >> a[i];
		sort(a,a+n);
		sort(s,s+n);
		int ok = 1;
		for(int i = 0;i < n;i++)
		{
			if(s[i]!=a[i])
			{
				ok = 0;
				break;
			}
		}
		if(ok) cout << "YES\n";
		else cout << "NO\n";
	}
	return 0;
}


你可能感兴趣的:(紫书 习题 5-3 uva 10763)