

一开始我的想法是把所有的导弹与第一个发射器的距离的平方算出来,然后排序,从大到小开始枚举出第二个发射器的半径,但是发现tle了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
int x1=0,y1=0,x2=0,y2=0;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
int n=0,s1[100000],s2[100000];
scanf("%d",&n);
int x[n],y[n];
for(int i=0;i<n;i++){
scanf("%d %d",&x[i],&y[i]);
s1[i]=pow(x1-x[i],2)+pow(y1-y[i],2);
}
int k=1;
sort(s1,s1+n);
int min;
min=s1[n-1];
for(int j=n-1;j>=1;j--){
for(int i=0;i<n;i++){
if(pow(x1-x[i],2)+pow(y1-y[i],2)==s1[j]){
s2[k]=pow(x2-x[i],2)+pow(y2-y[i],2);
k++;
break;
}
}
}
int a=0;
s2[0]=0;
int max=s2[a];
for(int j=n-2;j>=0;j--){
if(max<s2[a+1])
max=s2[a+1];
if(s1[j]+max<min)
min=s1[j]+max;
a++;
}
printf("%d",min);
return 0;
}
上面这个只有70分,想了一晚上,实在做不起来。
后来参考了一下。
#include<bits/stdc++.h>
using namespace std;
int X1,Y1,X2,Y2,n=0,minn,r,x,y;
struct data {
int r1,r2;
} a[100001];//结构体,定义两个变量
bool cmp(data a,data b) {
return a.r1>b.r1;
}//自行判断c++stl里的sort由大到小排列
int main() {
cin>>X1>>Y1>>X2>>Y2>>n;
for(int i=1; i<=n; i++) {
cin>>x>>y;
a[i].r1=pow(X1-x,2)+pow(Y1-y,2);
a[i].r2=pow(X2-x,2)+pow(Y2-y,2);
}//储存曼哈顿距离
sort(a+1,a+n+1,cmp);//排序
int i=2,rr1=a[1].r1,rr2=0;
minn=rr1+rr2;//定义最小值
while(i<=n) {
rr2=max(rr2,a[i-1].r2);
rr1=a[i].r1 ;
minn=min(minn,rr1+rr2);
i++;
}//暴力思想
cout<<minn;
return 0;
}
cmp这个可以。
jing
这篇博客探讨了如何解决一个二维平面上导弹防御系统的问题,通过计算导弹与发射器之间的距离来确定最佳的防御策略。作者首先尝试了一个直接但导致超时(tle)的解决方案,然后改进为使用排序和结构体来优化算法,最终实现了一个更高效的解决方案。博客重点在于算法优化和问题解决思路。

483

被折叠的 条评论
为什么被折叠?



