发发牢骚:
这是一道坑爹,囧人的题目。。首先测试数据就狠弱B了,完全不起啥作用。再者,额苦B地调试了三天的题目,最后发现,居然是输出的Case:中的冒号是中文的冒号。我勒个去,这神马囧遇,还有,在杭电上的wa都是290ms,或者是390ms,为啥是这样滴,按道理来说,输出地格式错误,应该0ms就挂了啊,(难道我推理错误了?),,好吧,不过说来说去,还是我自己瞎了眼了。。
三天啊,调试了那么久,怀疑了自己的代码那么久。 又是那句话,"每一个wa都有一个很有说服力的错误,就看你自己能不能发现了。" 憋死我了……下次眼神得调紧点儿。
题目意思:
甜土豆要去找他的妞儿,中途有一大拨坏土豆以一定的初速度追他,如果甜土豆被追到,就算挂了,所以,甜土豆要保证在不被坏土豆追到的情况下,越过N个山坡。
山坡是这样的。
解题思路:
狠简单的解题思路,直接用动量守恒定律定律,还有中途用到数学的求直线的解析式求直线上点的纵坐标。
先考虑没有坏土豆存在的情况下,注意题目中得意思是可以没有坏土豆的:
考虑两种情况:
1.这些山坡都是向下走滴,那么初速度只要为0就可以了。
2.这些山坡有的是向上走的,那么甜土豆的最小初速度就要用动量守恒定律去解决了。。
公式是:sv=sqrt(2*G*h);
然后考虑有坏土豆,这时候,甜土豆必须满足到达每一个坏土豆那么时的速度要比坏土豆的初速度要快,题目要求最小,最小当然就用等于坏土豆的速度去考虑咯。其中坏土豆只给出横坐标,那么你就要靠这些直线去求出每一个坏土豆的纵坐标,即坏土豆的高度。
代码:
#include
#include
using namespace std;
const int MAXV=10005;
const double G=20;
struct Edge//每条边的解析式
{
double k;
double b;
}edge[MAXV];
struct Point//每个山顶
{
double x;
double y;
}point[MAXV];
struct Bttter//坏土豆
{
double x;
double v;
double w;
}b[MAXV];
double h[MAXV];
int main(void)
{
int cas,cas_c,i,j,count;
double nv,b_num,s_w,sv;
scanf("%d",&cas);
for(cas_c=1;cas_c {
scanf("%lf%lf%lf",&nv,&b_num,&s_w);
for(i=0;i scanf("%lf%lf",&point[i].x,&point[i].y);
double ss;
double s_max=-2000000000;
for(i=1;i {
ss=point[i].y-point[0].y;
if((int)s_max< s_max=ss;
}
//求出每一条直线的k跟b值。就是数学上的求直线,好白痴的
for(i=1;i {
edge[i].k=(point[i].y-point[i-1].y)/(point[i].x-point[i-1].x);
edge[i].b=point[i].y-point[i].x*edge[i].k;
}
for(i=0;i{
scanf("%lf%lf%lf",&b[i].x,&b[i].v,&b[i].w);
b[i].x+=point[0].x;
}
for(i=0;i{
count=0;
for(j=0;j {
if((int)point[j].x {
count++;
}
else
break;
}
h[i]=edge[count].k*b[i].x+edge[count].b-point[0].y;
}
//没有坏土豆时,甜土豆必须有的初速度
if(s_max-0 sv=0;
else
sv=sqrt(2*G*s_max);
//有坏土豆时,再每一个坏土豆贪心下,求最优解
for(i=0;i {
double ev=sqrt(sv*sv-2*G*h[i]);
if(ev {
sv=sqrt(b[i].v*b[i].v+2*G*h[i]);
}
}
printf("Case %d: %.2lf\n",cas_c,sv);
}
return 0;
}