今天下午又重新温习了菜鸟杯题,,发现好多题就是用枚举方法A掉的,,里面并没有夹杂太多方面的高级算法,,没想到就这题在比赛竟然好些做不出来,,看来自己做的题还是少啊!!!!!
思路:这一题求最小半径平方和,先把第一个塔离敌军的营地排一下序(升序,降序都可以),然后枚举所有到第一个塔的距离,通过找第一个塔不能覆盖的敌军阵营离第二个塔最大的距离得出第二个塔的半径,,还有一点要注意就是最找离第二个塔最大距离时需要再开个数组存一下,,这样可以把时间复杂度从n*n降到n,一开始我没有存储,果断tle。。。
AC代码:
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #define N 100005 using namespace std; typedef struct{ int x,y; int d1,d2; }Node; Node p[N]; Node t1,t2; int maxd2[N]; bool cmp(const Node& a,const Node& b) {return a.d1>b.d1;} int distan(Node a,Node b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);} int main() { int Case; scanf("%d",&Case); while(Case--) { scanf("%d%d%d%d",&t1.x,&t1.y,&t2.x,&t2.y); int n; scanf("%d",&n); for(int i=0;i<n;++i) { scanf("%d%d",&p[i].x,&p[i].y); p[i].d1=distan(t1,p[i]); p[i].d2=distan(t2,p[i]); } sort(p,p+n,cmp); int bb=0xffffff; memset(maxd2,0,sizeof(maxd2)); maxd2[0]=0; for(int i=0;i<n;++i) { maxd2[i+1]=max(maxd2[i],p[i].d2); bb=min(maxd2[i]+p[i].d1,bb); } bb=min(bb,maxd2[n]); printf("%d\n",bb); }return 0; }
超时的代码: