比赛 20120418x 评测结果 C
题目名称 圣诞节 最终得分 0
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-18 17:02:46
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,nar[501][2],nvr[501][2];
int q[501][501]={0},low,high,mid;
int link[501]={0},used[501],ans=0;
bool check();
bool can(int t);
int main()
{
	freopen ("christmas.in","r",stdin);
	freopen ("christmas.out","w",stdout);
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		cin>>nar[i][0]>>nar[i][1];
	}
	for (int i=1;i<=n;i++)
	{
		cin>>nvr[i][0]>>nvr[i][1];
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=n;j++)
		{
			q[i][j]=(nar[i][0]-nvr[j][0])*(nar[i][0]-nvr[j][0])+(nar[i][1]-nvr[j][1])*(nar[i][1]-nvr[j][1]);
			//cout<<q[i][j]<<' ';
		}
		//cout<<endl;
	}
	low=0;
	high=12500;
	while (low<high)
	{
		mid=((low+high)>>1);
		if (check())
		{
			high=mid;
		}
		else
		{
			low=mid+1;
		}
	}
	cout<<mid+1;
	return 0;
}


bool check()
{
	ans=0;
	for (int i=1;i<=n;i++)
		link[i]=-1;
	for (int i=1;i<=n;i++)
	{
		memset(used, 0, sizeof(used));
		if (can(i))
			ans++;
	}
	if (ans>=n)
		return true;
	else
		return false;
}

bool can(int t)
{
	for(int i=1;i<=n;i++)
	{
		if(!used[i]&&q[t][i]<=mid)
		{
			used[i]=true;
			if(link[i]==-1||can(link[i]))
			{
				link[i]=t;
				return true;
			}
		}
	}
	return false;
}