给出起点,终点,和n个柱子,小球最多可以在中间弹跳b次。(不算起点,终点),问最小的初速度。
解法:枚举落地次数。
解法类似于http://blog.csdn.net/xtulollipop/article/details/52789712。。
先判断最小速度能不能到达。不能大话他肯定与某个柱子相切。枚举柱子,找到一个能让所有柱子都不相撞的函数。。取最小值。。
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
struct ZHU{
long double wz,hi;
long double newwz;
}zhu[11];
long double d,n,b;
bool judge(long double k,long double jian){
for(int i=1;i<=n;i++){
long double temp=k*(zhu[i].newwz)*(zhu[i].newwz-jian);
//cout<<temp<<endl;
if(temp-zhu[i].hi<-eps) return false;
}
return true;
}
int main(){
while(cin>>d>>n>>b){
for(int i=1;i<=n;i++) cin>>zhu[i].wz>>zhu[i].hi;
long double ans=1e20;
for(int i=1;i<=b+1;i++){
long double jian=d/i;
for(int j=1;j<=n;j++){
zhu[j].newwz=zhu[j].wz;
while(zhu[j].newwz-jian>0) zhu[j].newwz-=jian;
}
for(int j=0;j<=n;j++){
long double k;
if(j==0) k=-1.0/jian;
else k=zhu[j].hi/(zhu[j].newwz)/(zhu[j].newwz-jian);
if(judge(k,jian)==true){
long double vy=jian*sqrt(-k/2.0);
long double vx=jian/2.0/vy;
ans=min(ans,sqrt(vx*vx+vy*vy));
}
}
}
//printf("%.5Lf\n",ans);
cout<<fixed<<setprecision(8)<<ans<<endl;
}
return 0;
}
/*
100 1 0
50 100
10 1 0
4 2
100 4 3
20 10
30 10
40 10
50 10
343 3 2
56 42
190 27
286 34
14.57738
3.16228
7.78175
11.08710
*/