题意:
给出每个门起点,高度和横向长度以及滑板的垂直速度,水平速度恒定,求出能取的最快滑板速度.
思路:
二分确定最快速度,由于门的高低递增,所以检查速度是否可行时从后往前,看通过下个门的高度临界值时是否可以通过门.
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int w, v, n;
struct door {
double x, y;
}d[1000005];
int sn, s[1000005];
bool judge(int mid) {
double sv = s[mid];
double l = d[n-1].x;
double r = d[n-1].x+w;
for(int i=n-2; i>=0; i--) {
double q = v*((d[i+1].y-d[i].y)/sv);
l -= q, r += q;//左右分别能达到的极值
if(l < d[i].x) l = d[i].x;//与目的地的门比较
if(r > d[i].x+w) r = d[i].x+w;
if(r<l) return false;
}
return true;
}
int main() {
int kase;
scanf("%d", &kase);
while(kase--) {
scanf("%d%d%d", &w, &v, &n);
for(int i=0; i<n; i++) scanf("%lf%lf", &d[i].x, &d[i].y);
scanf("%d", &sn);
for(int i=0; i<sn; i++) scanf("%d", &s[i]);
sort(s,s+sn);
int l = -1, r = sn;
bool flag;
while(l<r-1) {
int mid = (l+r+1)/2;
flag = judge(mid);
if(flag) l = mid;
else r=mid;
}
if(l == -1) printf("IMPOSSIBLE\n");
else printf("%d\n", s[l]);
}
return 0;
}