UVA - 11627 Slalom

来源:互联网 发布:喜马拉雅电台 知乎 编辑:程序博客网 时间:2024/06/10 21:02

题目大意:在一场滑雪比赛中要通过n个门,给出每个门的坐标(xi,yi)。数据给出w(每个门的宽度),v(水平方向上的最大速度,即x轴),以及n。然后是n行门的坐标。在给出m,表示有m双滑雪鞋,每双鞋的速度为s[i]。问说可以通过所有旗门的滑雪板的最大速度。

解题思路:首先现将s[i]排序,然后二分答案。判断只需要更具前后两个旗门的高度差来计算时间,由上一个可达区间推出下一个可达区间,然后加以判断。

#include <cstdio>#include <algorithm>using namespace std;int W, v, N, S;int x[100010], y[100010], s[1000010];bool judge(int Vh) {    double l = x[N-1], r = x[N-1] + W;     for (int i = N - 2; i >= 0; i--) {        double t = 1.0 * (y[i+1] - y[i]) / Vh;        l -= t * v;        r += t * v;        if (x[i] + W < l || x[i] > r)            return false;        if (l < x[i])            l = x[i];        if (r > x[i] + W)            r = x[i] + W;     }    return true;}void solve() {    int L = 0, R = S - 1;    while (L < R) {        int mid = (L + R + 1) / 2;        if (judge(s[mid]))            L = mid;        else             R = mid - 1;    }    if (judge(s[L]))        printf("%d\n", s[L]);    else         printf("IMPOSSIBLE\n");}int main() {    int T;    scanf("%d", &T);    while (T--) {        scanf("%d%d%d", &W, &v, &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", &s[i]);        sort(s, s + S);        solve();    }    return 0;}
0 0
原创粉丝点击