/*
分析:
刚开始以为逐个读入,离A近就给A,否则给B,但是这个错的思路。
反eg:0 0 100 0,在0 49 51 0各有一个点,显然,用这个思路,花费
就是(49^2)*2。但是如果全部给A,一个都不给B呢?那就是51^2。显
然后者小。
将所有到A的距离排序,从最远的开始枚举(枚举出所有情况,下面
代码中的行70、71不能要):将该点给A,有总cost1,将改点给B,有总
cost2,如果cost1>cost2,则赋值cost1=cost2。
分析有风险,做题需谨慎啊。
2012-04-21
*/
分析:
刚开始以为逐个读入,离A近就给A,否则给B,但是这个错的思路。
反eg:0 0 100 0,在0 49 51 0各有一个点,显然,用这个思路,花费
就是(49^2)*2。但是如果全部给A,一个都不给B呢?那就是51^2。显
然后者小。
将所有到A的距离排序,从最远的开始枚举(枚举出所有情况,下面
代码中的行70、71不能要):将该点给A,有总cost1,将改点给B,有总
cost2,如果cost1>cost2,则赋值cost1=cost2。
分析有风险,做题需谨慎啊。
2012-04-21
*/
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
struct A
{
double d1;
double d2;
}E[111111];
int cmp(const struct A *a,const struct A *b)
{
if(a->d1>b->d1)
return 1;
else
return -1;
}
int main()
{
int T;
int n;
int i;
double x1,y1,x2,y2;
double x,y;
double cost_F,cost_T;
double temp;
int flag;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf%lf",&x,&y);
E[i].d1=pow(x-x1,2)+pow(y-y1,2);
E[i].d2=pow(x-x2,2)+pow(y-y2,2);
}
qsort(E,n,sizeof(E[0]),cmp);
temp=0;
flag=0;
cost_F=E[n-1].d1;
for(i=n-1;i>=0;i--)
{
if(E[i].d2>temp)
temp=E[i].d2;
if(i==0) //0特殊处理。
cost_T=temp;
else
cost_T=E[i-1].d1+temp;
if(cost_T<=cost_F)
cost_F=cost_T;
// else
// break;
}
printf("%.0lf\n",cost_F);
}
return 0;
}