为了确保能到达终点,我们需要满足下面两个条件
1.能够到达所有山顶
2.能够在遇到苦土豆时速度大于他
二者的速度可以用能量守恒定律做,苦土豆的坐标可通过三角形相似性来做
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
const int MAXN=;
int n,m,tt;
struct P
{
double x,h;
}node1[MAXN];
struct PP
{
double x,v;
}node2[MAXN];
int main()
{
int i,j,k,w;
double we,h;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&tt);
int ca=;
while(tt--)
{
double v0=,temp;
int g=;
scanf("%d%d%d",&n,&m,&w);
for(i=;i<=n;i++)
{
scanf("%lf%lf",&node1[i].x,&node1[i].h);
temp=sqrt(*g*(node1[i].h-node1[].h));
if(temp>v0) v0=temp;
}
double vx,v=;
for(i=;i<=m;i++)
{
scanf("%lf%lf%lf",&node2[i].x,&node2[i].v,&we);
node2[i].x+=node1[].x;
for(j=;j<n;j++)
{
if(node2[i].x>=node1[j].x&&node2[i].x<=node1[j+].x)
{
h=(1.0*(node1[j+].h-node1[j].h)/(node1[j+].x-node1[j].x))*(node2[i].x-node1[j].x) + node1[j].h; //bitter potatoe相对于原点的高度
break;
}
}
vx=sqrt(1.0*node2[i].v*node2[i].v+1.0**g*(h-node1[].h));
if(vx>v)
v=vx;
}
if(v>v0)
printf("Case %d: %.2lf\n",ca++,v);
else
printf("Case %d: %.2lf\n",ca++,v0);
}
}