bzoj2765[JLOI2010]铁人双项比赛
题意:铁人双项比赛由长跑和骑自行车组成,参赛选手必须先完成k公里的长跑,然后完成r公里的骑车,才能到达终点。参赛选手有的擅长长跑,有的擅长骑车。
如果总赛程s=k+r一定,那么K越大,对擅长长跑的选手越有利;k越小,对擅长骑车的选手越有利。
现在给定总赛程s,以及每个选手长跑和骑车的平均速度,请你求出对于某个指定的选手最有利的k和r。
所谓最有利,是指选择了这个k和r后,该选手可以获得冠军,且领先第2名尽量地多。
讲道理这题应该有SpecialJudge,但是BZOJ是在有多种方案时输出k最小的方案,题面上还没说…WA了一屏....
并不知道半平面交是什么东西(半瓶面胶),我写的是二分答案…首先我们把速度的单位从 千米/小时 转为 秒/千米,然后用i号选手的骑车速度减去n号选手的骑车速度,就表示i号选手和n号选手同时骑单位长度的车,n号选手会领先i号选手多少秒(负值表示n号选手落后i号选手).
接下来我们会发现,如果每长跑1千米n号选手会领先i号选手v1秒,每骑1千米车n号选手会领先i号选手v2秒(v1,v2均可能为负),二分答案时要求n号选手必须领先i号选手不少于ans秒,我们就可以确定一个关于k的不等式k*v1+(s-k)*v2>=ans,这里只有k未知,所以可以解出这个不等式.
每二分一个答案,一共得到n-1个形如”k>a”或”k<b”的不等式,只要判断这个不等式组有没有解即可.注意v1==v2的地方需要特判.最后一定要注意:输出解的时候k尽量小,所以最后利用二分出的答案解一遍不等式组,输出的时候用k的下界输出..
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
double v1[maxn],v2[maxn];
int s,n;
bool check(double ans){
double upper=s,lower=;
for(int i=;i<n;++i){
if(v1[i]==v2[i]){
if(s*v1[i]<ans)return false;
}
else if(v1[i]<v2[i])upper=min(upper,(ans-v2[i]*s)/(v1[i]-v2[i]));
else lower=max(lower,(ans-v2[i]*s)/(v1[i]-v2[i]));
}
return upper>=lower;
}
void work(double ans){
double upper=s,lower=;
for(int i=;i<n;++i){
if(v1[i]==v2[i])continue;
else if(v1[i]<v2[i])upper=min(upper,(ans-v2[i]*s)/(v1[i]-v2[i]));
else lower=max(lower,(ans-v2[i]*s)/(v1[i]-v2[i]));
}
printf("%.2f %.2f ",lower,s-lower);
}
int main(){
scanf("%d%d",&s,&n);
for(int i=;i<=n;++i){
scanf("%lf%lf",v1+i,v2+i);
v1[i]=/v1[i];v2[i]=/v2[i];
}
for(int i=;i<n;++i){
v1[i]-=v1[n];v2[i]-=v2[n];
}
double l=-,r=1e50;
while(r-l>=1e-){
double mid=(l+r)/2.0;
if(check(mid))l=mid;
else r=mid;
} if(r<)printf("NO\n");
else{
work(r);
printf("%.0f\n",r);
}
return ;
}
bzoj2765[JLOI2010]铁人双项比赛的更多相关文章
- 【BZOJ】【2765】【JLOI2010】铁人双项比赛
计算几何/半平面交 本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个…… 我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{ ...
- bzoj2765 铁人双项比赛
Description 铁人双项比赛是吉林教育学院的一项传统体育项目.该项目比赛由长跑和骑自行车组成,参赛选手必须先完成k公里的长跑,然后完成r公里的骑车,才能到达终点.每个参赛选手所擅长的项目不同, ...
- 【刷题】LOJ 2587 「APIO2018」铁人两项
题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段 ...
- [Luogu4630][APIO2018]Duathlon 铁人两项
luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...
- 【APIO2018】铁人两项(圆方树,动态规划)
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- [APIO2018]铁人两项 --- 圆方树
[APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...
- [APIO2018]铁人两项 [圆方树模板]
把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...
- [APIO2018]铁人两项——圆方树+树形DP
题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...
随机推荐
- 路由系统的核心对象——Router
路由系统的核心对象--Router ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路 ...
- Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...
- 前端见微知著工具篇:Bower组件管控
在上一篇文章中,我们提到了利用Grunt可以完成的内容,其中最主要的功能就是利用各种Node的组件来搭配出一个自动化高亮,自动化运行等的Web前端开发环境.但是Bower也是一个专门来管理各种依赖组件 ...
- 一道int与二进制加减题
int dis_data = 32769; if( dis_data > 0x7fff) dis_data -= 0xffff; printf("%d\n",dis_dat ...
- TRIGGER command denied to user 'root'@'LAPTOP-M7KUFN86' for table 'growtest' | Table 'MyDatabase.tmpIdentity_Invites' doesn't exist
是因为创建表的时候,用户权限不够 NaviCat for Mysql 用这个工具打开MYSQL 在用户 下找到 root@% 这个用户,双击打开 设置服务器权限,最后两个权限勾上就OK 了,需要把MY ...
- Qt学习笔记 信号和槽
槽和普通c++成员函数一样只可以为虚函数,也可以被重用,可以是公有的也可以是私有的,也可以被其它的c++函数调用; 参数也是任意的 唯一不同的是本槽和信号是可以连在一起的,和c#的事件差不多.相连后每 ...
- Android系统启动分析(Init->Zygote->SystemServer->Home activity)
整个Android系统的启动分为Linux Kernel的启动和Android系统的启动.Linux Kernel启动起来后,然后运行第一个用户程序,在Android中就是init程序. ------ ...
- 子Div使用Float后如何撑开父Div
如果想要撑开父元素可以采用以下方法: 方法一: 父元素设置overflow以及zoom,样式如下: 1 <style> 2 #div1{border:1px solid red;ove ...
- [BZOJ1407][NOI2002]Savage(扩展欧几里德)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1407 分析: m,n范围都不大,所以可以考虑枚举 先枚举m,然后判定某个m行不行 某个 ...
- equals()的用法
比如,两个对象 c1, c2; 那么,c1.equals(c2) == true; 则表示c1, c2两个变量的值是一致的 equals适用于所有对象,这是一种特殊方法 equals这种表现形式我们一 ...