wikioi1128 导弹拦截(理解思路)

本文介绍了一种针对两个拦截仪器A和B的最优配置算法,该算法通过计算目标点到两个仪器的距离平方来确定最少成本的配置方案。通过快速排序和迭代计算,找到在不同半径设置下A和B覆盖目标点的最低总代价。

设一个结构体存:编号n、距离x。

称两个拦截仪器分别为A和B。

读入时分别算出到A、B的距离的平方。(因为答案是平方和,且开方不开方大小关系不会变,所以不必开方,还便于后续处理)

分别存到a[i(1~n)].x,b[i].x中。

此外将a[0]和b[0]设为A、B半径为0时的状态。

按距离x大到小快排A(包括a[0],因此a[0]一定被排到最后一位a[n])

ma、mb分别存各状态时的A、B代价(答案ans=ma+mb)

初始设i=0,即A处理全部,B全不处理,此时初值ans=a[0].x+0;

写一个while循环(i<=n),

每次B处理此时距离A最远的点,即mb=b[a[i].n].x(通过结构体的编号检索)。

然后再做while循环(i<=n&&b[a[i].n].x<=mb),满足时i++,每次i至少加1。

此时ma=a[i].x,即B不能处理的点中A的最大距离。

每次ans=ans与ma+mb中的最小值。


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct aaaa{int l,hao;};
aaaa a[100001];
int b[100001],n;
bool cmp(aaaa a1,aaaa a2){
return a1.l>a2.l;
}
int main()
{
    int x1,y1,x2,y2;
    cin>>x1>>y1>>x2>>y2;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        a[i].hao=i;
        a[i].l=(x1-x)*(x1-x)+(y1-y)*(y1-y);
        b[i]=(x2-x)*(x2-x)+(y2-y)*(y2-y);
    }
    sort(a+1,a+1+n,cmp);
    int mins=a[1].l,k=1;
    while(k<=n){
            int mb=b[a[k].hao];
        while(k<=n&&b[a[k].hao]<=mb){
            k++;
        }
        int ma;
        if(k>n)ma=0;
        else ma=a[k].l;
        mins=min(mins,ma+mb);
    }
    cout<<mins;
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值