本文主要是介绍2011百校联动“菜鸟杯”程序设计公开赛Cover The Enemy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天下午又重新温习了菜鸟杯题,,发现好多题就是用枚举方法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;
}
超时的代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define N 100005
using namespace std;
typedef struct{ int x,y;
int d1,d2;
}Node;
Node p[N];
Node t1,t2;
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;
//cin>>Case;
scanf("%d",&Case);
while(Case--)
{ //cin>>t1.x>>t1.y>>t2.x>>t2.y;
scanf("%d%d%d%d",&t1.x,&t1.y,&t2.x,&t2.y);
int n;
//cin>>n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{ //cin>>p[i].x>>p[i].y;
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;
for(int i=0;i<n;++i)
{ int aa=0;
for(int j=0;j<i;++j)
aa=max(aa,p[j].d2);
bb=min(p[i].d1+aa,bb);
}
//cout<<bb<<endl;
printf("%d\n",bb);
}return 0;
}
这篇关于2011百校联动“菜鸟杯”程序设计公开赛Cover The Enemy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!