洛谷P1158 导弹拦截

这篇博客探讨了如何解决一个二维平面上导弹防御系统的问题,通过计算导弹与发射器之间的距离来确定最佳的防御策略。作者首先尝试了一个直接但导致超时(tle)的解决方案,然后改进为使用排序和结构体来优化算法,最终实现了一个更高效的解决方案。博客重点在于算法优化和问题解决思路。

在这里插入图片描述
在这里插入图片描述
一开始我的想法是把所有的导弹与第一个发射器的距离的平方算出来,然后排序,从大到小开始枚举出第二个发射器的半径,但是发现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值