您的位置:首页 > 编程语言 > Go语言

UVALive 6835 Space Golf-计算几何

2015-12-08 16:33 363 查看
题目意思:是在一段长度为d的区域内有许多已知坐标pi和高度hi的障碍物。你要发射一个球经过若干次反弹(越过障碍物)到达终点。反弹次数有限不能超过b,不能正好落在障碍物上,每次碰撞都是理想碰撞,不消耗能量。问最小的出射速度。

解题思路:因为限制的反弹次数是有限的,所以枚举每一个反弹次数,然后求出每个区间长度len=d/(b+1);对于每个区间暴力枚举每个障碍物,若有障碍物在区间内就跳过,否则就判断每个在区间内的障碍物所需的最小角度,通过角度能算出速度。然后在这些角度中取一个最大值。需要注意的是:因为答案所求的是最小的速度,而不是最小角度,而要达到最小速度则需要显然45度最小。所以若所有角度最大值比45度小,则选取作为最小速度的角度要用45度。

代码:
#include<bits/stdc++.h>
using namespace std;
double p[111],h[111],ans[111];
double sov(double d,double p,double h) {
double a1=-(1.0/2.0)*p*p,b1=p,c1=h,a2=-(1.0/2.0)*d*d,b2=d,c2=0.0;
double xa=(c1*b2-c2*b1)/(a1*b2-a2*b1);
double xb=(a1*c2-c1*a2)/(a1*b2-a2*b1);
double vx=sqrt(1.0/xa);
double vy=xb*vx;
return vy/vx;
}
int main()
{
//freopen("test","r",stdin);
double d;
int n,b;
while(scanf("%lf%d%d",&d,&n,&b)!=EOF) {
for(int i=1;i<=n;i++) {
scanf("%lf%lf",&p[i],&h[i]);
}
for(int i=0;i<=b;i++) {
ans[i]=999999.0;
double len=d/(i+1);
int fa=1;
for(int j=1;j<=n;j++) {
for(int k=1;k<=i;k++) {
if(k*len==p[j]) {
fa=0;
break;
}
}
if(fa==0) {
break;
}
}
if(fa==0) {
continue;
}
double maxn=1.0;
for(int j=0;j<=b;j++) {
double qi=len*j;
double zhong=len*(j+1);
for(int k=1;k<=n;k++) {
if(p[k]>qi&&p[k]<zhong) {
double dd=sov(len,p[k]-qi,h[k]);
maxn=max(maxn,dd);
}
}
}
ans[i]=sqrt(len/2.0/maxn)*sqrt(1.0+maxn*maxn);
}
double mmm=9999999.0;
for(int i=0;i<=b;i++) {
mmm=min(mmm,ans[i]);
}
printf("%.5f\n",mmm);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: