论define int long long
查看原帖
论define int long long
250699
mot1ve楼主2020/8/31 19:21

把define int long long去掉,全改成int就对了。long long会输出一个很大的负数。奇怪

//先来个错误贪心骗分
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f3f3f3f3f;
int d[100010];//dis1表示每个点到第一个系统的距离的平方,dis2表示每个点到第二个系统的距离的平方 
int n,x_1,y_1,x_2,y_2;
int ans=INF;
struct node{
	int x,y;
}a[100010];
bool cmp(node a,node b)
{
	int f1=(a.x-x_1)*(a.x-x_1)+(a.y-y_1)*(a.y-y_1);
	int f2=(b.x-x_1)*(b.x-x_1)+(b.y-y_1)*(b.y-y_1);
	return f1<f2;//每个导弹按照距离1系统的距离升序排序 
}
signed main()
{
	cin>>x_1>>y_1>>x_2>>y_2;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a+1,a+1+n,cmp);
	for(int i=n;i>=1;i--)//核心:预处理出1不选的导弹到2的最大值。 
	{
		int dis=(a[i].x-x_2)*(a[i].x-x_2)+(a[i].y-y_2)*(a[i].y-y_2);//按照导弹距离1的距离从远到近枚举,预处理出距离2的距离
		d[i]=max(d[i+1],dis);
	}
	for(int i=1;i<=n;i++)//枚举系统1拦截哪些导弹 
	{
		int res=0;
		res+=(a[i].x-x_1)*(a[i].x-x_1)+(a[i].y-y_1)*(a[i].y-y_1);//系统1的半径 
		res+=d[i+1];//系统2的半径
		ans=min(ans,res); 
	}
	cout<<ans;
	return 0;
} 
2020/8/31 19:21
加载中...