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"