UVALive 6835 Space Golf-计算几何

题目意思:是在一段长度为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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值