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(二分法)的更多相关文章
- C语言两种查找方式(分块查找,二分法)
二分法(必须要保证数据是有序排列的): 分块查找(数据有如下特点:块间有序,块内无序):
- poj3122-Pie(二分法+贪心思想)
一,题意: 有f+1个人(包括自己),n块披萨pie,给你每块pie的半径,要你公平的把尽可能多的pie分给每一个人 而且每个人得到的pie来自一个pie,不能拼凑,多余的边角丢掉.二,思路: 1,输 ...
- 二分法&三分法
ural History Exam 二分 #include <iostream> #include <cstdlib> using namespace std; //二分 ...
- [No000087]Linq排序,SortedList排序,二分法排序性能比较
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)
冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...
- iOS常见算法(二分法 冒泡 选择 快排)
二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = l ...
- java简单的二分法排序
二分法排序的思路:数据元素要按顺序排列,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于当前位置值,则在数列的前半段中查找:若 x 大于当前位置值则在数列的后 ...
- 使用二分法查找mobile文件中区号归属地
#!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...
- Atitit 迭代法 “二分法”和“牛顿迭代法 attilax总结
Atitit 迭代法 "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1. ...
随机推荐
- MySQL各种日期类型与整型(转)
日期类型 存储空间 日期格式 日期范围 datetime 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 t ...
- (hdu step 6.3.5)Card Game Cheater(匹配的最大数:a与b打牌,问b赢a多少次)
称号: Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- [Java][Android][Process] 分享 Process 运行命令行封装类型
我在以前的文章中提到,使用Java不会有一个问题,创建运行命令来创建太多进程后创建进程行语句. [Android] ProcessBuilder与Runtime.getRuntime().exec分别 ...
- 利用hibernate的session查询数据库,而且在jsp页面显示表内容的方法
试过了非常多种方法都没有成功,最终让我找到了这样的方法! 首先在后台写代码: Transaction tx = session.beginTransaction(); List list = sess ...
- Ecshop他们主动双语版切换来推断个人的计划
个人思路是基于浏览器的语言来推断自己主动,假设中国的浏览器,对使用中国模板.将英语模板.于.英国的模板差值称为不同的产品类别.文章分类,的模板可设置为相同的固定的文本language,所以你不会有打造 ...
- Minimum Sum LCM(uva10791+和最小的LCM+推理)
L - Minimum Sum LCM Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- System.ComponentModel.BackgroundWorker在WinForm中的异步使用
为了防止操作过程中界面卡死,和WinForm搭配最适合的就是BackgroundWorker了.BackgroundWorker 类 using System; using System.Compon ...
- AM335x(TQ335x)学习笔记——u-boot-2014.10移植
根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...
- EntityFramework6 用 PostgreSQL
开篇 1.这是自己第一篇博客,希望能够坚持下去.. 2.可能技术比较初级,大神看不下的话,多鼓励.. 3.开发环境为 vs2013,.net framework 4.5; 开始 1.安装entityf ...
- 例如找出令人信服的权威C++中间malloc与new
例如找出令人信服的权威C++中间malloc与new 问题: 非常多人都知道malloc与new都是用来申请空间用的,开辟空间来源于堆中. 可是在C++中却非常少用malloc去申请空间,为什么? 以 ...