UVA11627-Slalom

题目链接

题意:有n个宽为w的旗门,第i个旗门左端的坐标为(xi,
yi),对于所有1 <= i < n满足yi < y(i+1)。你有s双滑雪板,第j双的速度为sj(垂直向下的速度)。你的水平速度不能超过v(任意变速)。起点和终点的坐标任意选择,求用时最少可以通过所有旗门的滑雪板。

思路:当垂直速度越小时,到达下一个旗门的概率就越大。所以先将滑雪板的速度从小到大排序。其实一个旗门到下一个旗门是有一个区间的,所以只要下一个旗门与这个区间有交集,就代表能从上一个抵达下一个,我们就可以根据这个做法加上二分法查找能通过所有旗门的最大速度。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 1000005;

struct gate{
    double x, y;
}g[MAXN];

int w, v, n, s;
int sv[MAXN];

int judge(int mid) {
    double ss = sv[mid];
    double l = g[n - 1].x;
    double r = g[n - 1].x + w;
    for (int i = n - 2; i >= 0; i--) {
        l -= (v * (g[i + 1].y - g[i].y) / ss);
        r += (v * (g[i + 1].y - g[i].y) / ss);
        if (l < g[i].x)
            l = g[i].x;
        if (r > g[i].x + w)
            r = g[i].x + w;
        if (r < l) {
            return false;
        }
    }
    return true;
}

int main() {

    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d%d%d", &w, &v, &n);
        for (int i = 0; i < n; i++)
            scanf("%lf %lf", &g[i].x, &g[i].y);
        scanf("%d", &s);
        for (int i = 0; i < s; i++)
            scanf("%d", &sv[i]);
        sort(sv, sv + s);

        int L = -1, R = s, mid;
        while (L < R - 1) {
            mid = L + (R - L) / 2;
            if (judge(mid))
                L = mid;
            else
                R = mid;
        }
        if (L == -1)
            printf("IMPOSSIBLE\n");
        else
            printf("%d\n", sv[L]);
    }
    return 0;
}

UVA11627-Slalom,布布扣,bubuko.com

时间: 2024-12-21 05:18:50

UVA11627-Slalom的相关文章

【CF720D】Slalom 扫描线+线段树

[CF720D]Slalom 题意:一个n*m的网格,其中有k个矩形障碍,保证这些障碍不重叠.问你从(1,1)走到(n,m),每步只能往右或往上走,不经过任何障碍的方案数.两种方案被视为不同,当且仅当存在一个障碍,它在第一种方案里被从右侧绕过,而在第二种方案里被从左侧绕过(第一种左,第二种右同理). $n,m\le 10^6,k\le 10^5$. 题解:首先我们将相同方案的不同路线放到一起,并用其中最低的那个路线来代表这个方案.然后考虑扫描线,当新加入一个障碍的左侧时,这个侧面以左的所有路线都

Slalom

题意: 有n个宽度为w的门,给出门的左端点的水平位置x和高度y,和恒定的垂直速度,现有s个速度,求能通过这n个门的最大速度. 分析: 二分速度判断 #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector>

UVa (二分) 11627 Slalom

题意: 有宽度相同的水平的n个旗门,水平(纵坐标严格递增)滑行的最大速度为Vh(水平速度可以任意调节).然后还有S双滑雪板,每双滑雪板的垂直速度一定. 然后求能通过的滑板鞋的最大速度. 分析: 显然,滑雪板的速度越小越容易通过所有的旗门.然后二分找出这个能通过旗门的最大值,最后在滑雪板里面找出这个范围的最大值. 如何判断某个速度可以通过所有的旗门: 第一个旗门处起点可以是任意的,到达第二个旗门的垂直高度时有一个范围,然后和第二个旗门的宽度的范围求交集.如果为∅,则不能通过.否则,继续求到达下一个

UVA 11627 Slalom

二分,判断的时候,一个点一个点的考虑肯定是不行啦,考虑的单位是一个区间, 每次左端点尽量向左边移动,右端点尽量向右,得到下次可以达到的范围,检查一下和下一个区间有没有交集. #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5, maxns = 1e6+5; double x[maxn],y[maxn]; double W,vh; int N; int S[maxns]; bool ok(int s) { dou

计算几何题目分类

转载 一.基础题目 1.1 有固定算法的题目 A, 最近点对问题最近点对问题的算法基于扫描线算法.ZOJ 2107    Quoit Design    典型最近点对问题POJ    3714    Raid    变种最近点对问题 B,最小包围圆最小包围圆的算法是一种增量算法,期望是O(n).ZOJ    1450    Minimal Circle  HDU    3007    Buried memory C,旋转卡壳POJ 3608    Bridge Across Islands   

一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora

本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL数据库产品负责人. 云数据库与传统数据库的战争已打响,一个字概括就是"抢". 如火如茶的 AWS re:Invent 2018大会闭幕了,相信云养鹅的产品经理们又准时打开油管,Recap一年一度的科技盛宴. 据说今年一共发布了140多项产品服务,但是,Amazon Aurora 数据库 仍