【BZOJ】【2765】【JLOI2010】铁人双项比赛

计算几何/半平面交



  本来我是想去写POJ 1755的,然后想起了这道跟它很像的题,但应该是弱化版,所以就先写了这个……

  我们可以发现每个人的总用时,与k是呈一次函数关系的:$time_i=\frac{k}{Vrun_i}+\frac{S-k}{Vride_i}$

  然而我们要找的是某个k,使得$min(time_n-time_i)$最大

  那么就是一个线性规划问题了……这个也可以用半平面交来做……(蒟蒻并不会单纯形)

  下面的部分为了偷懒简洁我就用$a_i$和$b_i$来代替两种速度……

  我一开始想的做法是:维护一个$y=(\frac{1}{a_i}-\frac{1}{b_i})*x+\frac{S}{b_i}$的最小值(上凸壳?),然后由于线性分段函数的极值一定在分界点处取到(BZOJ 1038 瞭望塔),所以可以枚举分界点计算答案。

  然而不会写……后来膜拜了lyd神犇的代码,发现:

    这题$n\leq 100$,所以找到可能成为分界点的点,即所有直线的交点,暴力更新答案就好了……

    然后还有一个地方是将不等式重新变形了一下,将第n条直线直接减到前面n-1条直线中……

  无限ym……

 1 /**************************************************************
 2     Problem: 2765
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:40 ms
 7     Memory:1276 kb
 8 ****************************************************************/
 9
10 //BZOJ 2765
11 #include<cmath>
12 #include<cstdio>
13 #include<cstring>
14 #include<cstdlib>
15 #include<iostream>
16 #include<algorithm>
17 #include<iomanip>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 using namespace std;
22
23 const int N=110;
24 /*******************template********************/
25 typedef long double lf;
26 #define eps 1e-12
27 int n,num;
28 lf a[N],b[N],c[N],d[N],S,anst,ansk;
29
30 void calc(lf k){
31     lf t=1e100;
32     F(i,1,n-1) t=min(t,k*c[i]+d[i]);
33     if (t>anst) anst=t,ansk=k;
34 }
35
36 int main(){
37 #ifndef ONLINE_JUDGE
38     freopen("2765.in","r",stdin);
39 //  freopen("2765.out","w",stdout);
40 #endif
41     cin >>S>>n;
42     F(i,1,n) cin >> a[i] >> b[i];
43     F(i,1,n-1){
44         c[i]=1/a[i]-1/b[i]-1/a[n]+1/b[n];
45         d[i]=S/b[i]-S/b[n];
46     }
47
48     anst=-1e100;
49     F(i,1,n-1) F(j,i+1,n-1){
50         if (fabs(c[i]-c[j])<eps) continue;
51         lf k=(d[j]-d[i])/(c[i]-c[j]);
52         if (k<eps || k>S-eps) continue;
53         calc(k);
54     }
55     calc(0); calc(S);
56     anst*=3600;
57     if (anst<-eps) puts("NO");
58     else{
59         if (anst<eps) anst=0;
60         cout<<setprecision(2)<<fixed<<ansk<<‘ ‘<<S-ansk<<‘ ‘;
61         cout<<setprecision(0)<<fixed<<anst<<endl;
62     }
63     return 0;
64 }

2765: [JLOI2010]铁人双项比赛

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 477  Solved: 117
[Submit][Status][Discuss]

Description


人双项比赛是吉林教育学院的一项传统体育项目。该项目比赛由长跑和骑自行车组成,参赛选手必须先完成k公里的长跑,然后完成r公里的骑车,才能到达终点。
每个参赛选手所擅长的项目不同,有的擅长长跑,有的擅长骑车。如果总赛程s=k+r一定,那么K越大,对擅长长跑的选手越有利;k越小,对擅长骑车的选手
越有利。

现在给定总赛程s,以及每个选手长跑和骑车的平均速度,请你求出对于某个指定的选手最有利的k和r。所谓最有利,是指选择了这个k和r后,该选手可以获得冠军,且领先第2名尽量地多。

Input

你的程序从文件读入输入数据。

输入的第一行是两个正整s和n,s表示总赛程(单位为公里,s≤231),n表示参赛总人数(2≤n≤100)。

接下来的n行每行是两个实数,分别表示每个选手长跑的平均速度和骑车的平均速度(单位为千米/小时)。

第n个选手就是指定的选手,你的任务是求出对他最有利的k和r。

Output

你的程序的输出包括三个数k,r, t,分别表示对第n号选手最有利的k和r(浮点数,保留小数点后2位),以及在选择k和r的情况下,第n号选手最多可以领先第2名多少秒(四舍五入到整数);如果另一个选手和该选手并列第一,则t i=0。倘若无论选择什么k,r都不能使第n号选手获胜,则输出“NO”。

Sample Input

100 3
10.0 40.0
20.0 30.0
15.0 35.0

Sample Output

14.29 85.71 612

HINT

Source

[Submit][Status][Discuss]

时间: 2024-11-10 04:17:46

【BZOJ】【2765】【JLOI2010】铁人双项比赛的相关文章

[圆方树] Luogu P4630 Duathlon 铁人两项

题目描述 比特镇的路网由 mm 条双向道路连接的 nn 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段赛程. 比赛的路线要按照如下方法规划: 先选择三个两两互不相同的路口 s, cs,c和 ff,分别作为比赛的起点.切换点(运动员在长跑到达这个点后,骑自行车前往终点).终点. 选择一条从 ss出发,经过 cc最终到达 ff的路径.考虑到安全因素,选择的路径经过同一个点至多一次. 在规划路径之前,镇长想请你帮忙计

数据包分析之信息安全铁人三项

电子取证是指利用计算机软硬件技术,以符合法律规范的方式对计算机入侵.破坏.欺诈.攻击等犯罪行为进行证据获取.保存.分析和出示的过程.从技术方面看,计算机犯罪取证是一个对受侵计算机系统进行扫描和破解,对入侵事件进行重建的过程.具体而言,是指把计算机看作犯罪现场,运用先进的辨析技术,对计算机犯罪行为进行解剖,搜寻罪犯及其犯罪证据. 随着计算机犯罪个案数字不断上升和犯罪手段的数字化,搜集电子证据的工作成为提供重要线索及破案的关键.恢复已被破坏的计算机数据及提供相关的电子资料证据就是电子取证. 本文针对

React 中双项绑定

React 中双项绑定,文本输入框的值,不能用 this.props.value 读取,而要定义一个 onChange 事件的回调函数,通过 event.target.value 读取用户输入的值. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>React--表单双项绑定</title> <scr

【APIO2018】铁人两项

[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经过一次)的数量. \(1\leq n,\leq 10^5,1\leq m\leq 2*10^5\) 我们考虑枚举\(s,f\)然后计算中间\(c\)的数量.我们发现对于一张图上统计两点之间路径上的点数量很好做.于是我们考虑建圆方树. 我们将圆点的权值定为\(-1\),将方点的权值定为与其直接相连的圆

bzoj 2565: 最长双回文串

Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串. Input 一行由小写英文字母组成的字符串S. Output 一行一个整数,表示最长双回文子串的长度. Sample Input baacaabbacabb Sample Output 12 HINT

BZOJ 2080: [Poi2010]Railway 双栈排序

2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Status][Discuss] Description 一个铁路包含两个侧线1和2,右边由A进入,左边由B出去(看下面的图片) 有n个车厢在通道A上,编号为1到n,它们被安排按照要求的顺序(a1,a2,a3,a4....an)进入侧线,进去还要出来,它们要按照编号顺序(1,2,3,4,5....n)从通道B

铁人两项

题目描述: 给定无向图G,包含n个点m条边(不保证连通),求有序三元组(s,c,f)个数要求满足 s, c, f 都是图中的点,且存在一条从s到c的路径和一条从c到f的路径,使得两条路径没有公共点(除c外). 在这里我们引进圆方树的概念. 但首先我们要了解一下点双和边双. 在无向图中: 点双:极大的连通子图,使得删掉这个子图中的任何一个点,这个子图仍然连通. 也就是说,在这个极大的连通子图中没有割点. 也就是说,在这个极大的连通子图中两个不同节点可以通过两条没有公共点的路径互相到达,但是排除起点

广东选手 角逐10项比赛

http://bbs.hsw.cn/7122314http://bbs.hsw.cn/7122314/spacelist-profile.htmlhttp://bbs.hsw.cn/apps.php?q=weibo&uid=7122314http://bbs.hsw.cn/7122314/spacelist-blog.htmlhttp://bbs.hsw.cn/7122314/spacelist-image.htmlhttp://bbs.hsw.cn/7122314/viewspace-bbs.

BZOJ 2565 最长双回文串 Hash+二分

题目大意:给定一个字符串,求一个最长的子串,该字串可以分解为两个回文子串 傻逼的我又忘了Manacher怎么写了= = 无奈Hash+二分吧 首先将字符串用分隔符倍增,然后求出以每个点为中心的最长回文半径 然后考虑两个回文串怎么合并成一个 我们发现图中以i为中心的回文串和以j为中心的回文串合并后长度恰好为(j-i)*2 能合并的前提是以两个点为中心的回文串有交点 那么对于每个j我们要求出有交点的最左侧的i 维护一个后缀min随便搞搞就可以了 #include <cstdio> #include