#include<bits/stdc++.h>
#define debu
using namespace std;
const int maxn=1e6+50;
int maxx,w,vh,n,s,ans,tmp;
int x[maxn],y[maxn],ski[maxn];
int check(int speed)
{
double l=(double)x[0],r=(double)(x[0]+w);
for(int i=1; i<n; i++)
{
double d=(double)(y[i]-y[i-1])/(double)speed*vh;
l-=d;r+=d;
l=max(l,(double)x[i]);
r=min(r,(double)(x[i]+w));
if(l>r) return 0;
}
return 1;
}
void solve()
{
int l=0,r=maxx,mid;
while(l<r)
{
mid=l+(r-l+1)/2;
if(check(mid))
{
tmp=mid;
l=mid;
}
else r=mid-1;
}
}
void output()
{
sort(ski,ski+s);
for(int i=0; i<s; i++)
{
if(ski[i]<=tmp) ans=ski[i];
else break;
}
if(ans!=-1) printf("%d\n",ans);
else printf("IMPOSSIBLE\n");
}
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
int t;
scanf("%d",&t);
while(t--)
{
ans=-1;
tmp=-1;
maxx=0;
scanf("%d%d%d",&w,&vh,&n);
for(int i=0; i<n; i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%d",&s);
for(int i=0; i<s; i++)
{
scanf("%d",&ski[i]);
maxx=max(maxx,ski[i]);
}
solve();
output();
}
return 0;
}
题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2674
题解:当速度越小时,越易成功穿过。二分速度v,寻找速度最大值,判断是否合法:求出当前可达区间,与下一位置区间求并,若不为空,则可到达下一位置。最后寻找小于等于v的最大速度即可。