NOIp2010 导弹拦截

这篇博客探讨了NOIp2010中导弹拦截问题的解决方案,指出初尝试的算法只得了40分。博主发现自己的算法存在反例,并在网上找到了正确的题解。正确方法是将导弹到某拦截点距离平方排序,从最远的导弹开始逐个考虑,应用贪心法以确保最优解。最后,博主提供了C++代码实现这一算法。
摘要由CSDN通过智能技术生成

1、本题很显然用贪心法,我的做法是,先比较某个导弹和哪个拦截点最近,然后导弹就归属于那个拦截点,求出两个拦截点各自能拦截到的最远的导弹,然后将这两个距离相加,测评后只得了40分。

2、想出了一个反例。比如两个拦截点在一维数轴上,A在左,B在右,导弹1在A\B间距离A30米距离B31米的地方,导弹2在B右边,距离B40米的地方,按我的算法,答案是50的平方,实际上只是40的平方就可以了,也就是说,我的算法只是凭感觉得出的,是一些特例的归纳,并不能包含全部。

3、上网搜题解,发现是先将所有导弹到A的距离的平方排序,然后从最大的开始,一个一个往下减,在减的过程中,可能会有最优值出现。注意,一定是从最外层开始减,因为如果从内层开始减,答案不会变得更好,这也就是“贪心法”思想的应用了。

#include<cstdio>
#include<algorithm>
using namespace std;
int x1,y1,x2,y2,T,d,temp,ans;
struct point{
   int x,y;
   bool operator < (const point &obj) const{
       return (x-x1)*(x-x1)+(y-y1)*(y-y1)<(obj.x-x1)*(obj.x-x1)+(obj.y-y1)*(obj.y-y1);
   }
};
point a[100010];
int main(){
    freopen("missile.in"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值