记录编号 92239 评测结果 AAAAAA
题目名称 圣诞节 最终得分 100
用户昵称 Gravatardigital-T 是否通过 通过
代码语言 C++ 运行时间 0.416 s
提交时间 2014-03-19 15:59:05 内存使用 1.32 MiB
显示代码纯文本
#include<fstream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define sqr(X) (X)*(X)
using namespace std;
ifstream fi("christmas.in");
ofstream fo("christmas.out");
int N;
int h[1100],age[1100];
int dis[510][510];
bool vis[510];
int match[510];
bool find(int u,int ans)
{
	for(int v=1;v<=N;v++)
		if(dis[u][v]<=ans)
		{
			if(!vis[v])
			{
				vis[v]=true;
				if(!match[v]||find(match[v],ans))
				{
					match[v]=u;
					return true;
				}
			}
		}
	return false;
}
bool work(int ans)
{
	memset(match,0,sizeof(match));
	int tot=0;
	for(int i=1;i<=N;i++)
	{
		memset(vis,0,sizeof(vis));
		if(find(i,ans))tot++;
	}
	return tot==N;
}
int main()
{
	int l=12500,r=0;
	fi>>N;
	for(int i=1;i<=N*2;i++)
		fi>>h[i]>>age[i];
	for(int i=1;i<=N;i++)
		for(int j=1;j<=N;j++)
		{
			dis[i][j]=sqr(h[i]-h[j+N])+sqr(age[i]-age[j+N]);
			l=min(dis[i][j],l);
			r=max(dis[i][j],r);
		}
	int mid=(l+r)/2;
	int ans;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(work(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	fo<<ans<<endl;
	return 0;
}