题目链接

题意:有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(二分法)的更多相关文章

  1. C语言两种查找方式(分块查找,二分法)

    二分法(必须要保证数据是有序排列的):   分块查找(数据有如下特点:块间有序,块内无序):    

  2. poj3122-Pie(二分法+贪心思想)

    一,题意: 有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人 而且每个人得到的pie来自一个pie,不能拼凑,多余的边角丢掉.二,思路: 1,输 ...

  3. 二分法&三分法

    ural History Exam    二分 #include <iostream> #include <cstdlib> using namespace std; //二分 ...

  4. [No000087]Linq排序,SortedList排序,二分法排序性能比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  5. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  6. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

  7. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  8. java简单的二分法排序

    二分法排序的思路:数据元素要按顺序排列,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于当前位置值,则在数列的前半段中查找:若 x 大于当前位置值则在数列的后 ...

  9. 使用二分法查找mobile文件中区号归属地

    #!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...

  10. Atitit 迭代法  “二分法”和“牛顿迭代法 attilax总结

    Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...

随机推荐

  1. YT新人之巅峰大决战03

    题目链接 Problem Description Now give you two integers n m, you just tell me the m-th number after radix ...

  2. Cocos2d-x 如何输出 Android用电话 腰带Tag的Log刊物

    于Cocos2d-x根据代码 #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #define LOGAnroid( ...) #else if (CC_TAR ...

  3. c++ stl algorithm: std::find, std::find_if

    std::find: 查找容器元素, find仅仅能查找容器元素为<基本数据类型> [cpp] view plaincopy #include <iostream> #incl ...

  4. 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案

    内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...

  5. ServletWeb缓存解决问题

    (1)为什么我们要防止这个问题的浏览器页面缓存: 所以在不须要缓存的页面中须要实现不缓存页面. 代码例如以下: package com.lc.HttpTest; import java.io.IOEx ...

  6. 动软.NET 分页存储过程UP_GetRecordByPage

    1, ------------------------------------ --用途:支持任意排序的分页存储过程 --说明: ----------------------------------- ...

  7. linux下磁盘进行分区、文件系统创建、挂载和卸载(转)

    任务的原因:由于,刚购买来的服务器需要将磁盘挂载到操作系统上,为了挂载磁盘首先要对磁盘进行分区,然后进行文件系统的创建,最后将磁盘挂载到操作系统上的某个目录. MBR(Master Boot Reco ...

  8. DNA和纳米(Nano)Fusion技术的发展趋势

    细观国内外有关DNA与Nano技术的报道.不得不承认存在不小的差距,并且差距有继续拉大的趋势. 在我们国内,DNA技术是作为遗产基因来对待的.引用的有关中文參考资料一般比較陈旧.缺少參考价值.在发达国 ...

  9. R语言做文本挖掘 Part4文本分类

    Part4文本分类 Part3文本聚类提到过.与聚类分类的简单差异. 那么,我们需要理清训练集的分类,有明白分类的文本:測试集,能够就用训练集来替代.预測集,就是未分类的文本.是分类方法最后的应用实现 ...

  10. Design Pattern Command 命令设计模式

    这种设计模式是使用不同类的包裹不同的命令,达到什么样的命令执行什么操作. 有可能进一步利用map您最喜欢的对接命令字. 正在运行的类实际上已经包含了操作的所有需求,例如: class SuperMak ...