UVA - 11627 Slalom

题目大意:在一场滑雪比赛中要通过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;
}

你可能感兴趣的:(UVA - 11627 Slalom)