【三分搜索算法】UVa 10385 - Duathlon
题意:“铁人三项”比赛中,需要选手在t km的路程里进行马拉松和骑自行车项目。现有n名选手,每位选手具有不同的跑步速度和骑车速度。其中第n位选手贿赂了裁判员,裁判员保证第n名选手一定会取得冠军。问当马拉松路程与自行车路程分别为多少时,第n名选手才能取得冠军。
输出冠军与第二名所差的秒数以及马拉松路程与自行车路程。
分析:
设马拉松路程为r时选手i的用时:f(r) = r/rv[i] + (t-r)/kv[i] = ((kv[i]-rv[i])*r + t*rv[i])/(kv[i]*rv[i]);
由于kv[i]-rv[i]正负未知,则f(r)可以看做是一单峰极值曲线。选用三分法求解;
三分法求解思路:
上图中,蓝色线代表第n位选手在r取(0,t)时的用时,橙色线代表其他n-1名选手的最短用时,红线为橙线减蓝线的差值(注意此时红线的值为负)。可知,要使第n名选手获胜,必须取蓝线低于橙线的r值。
以橙线值(tmp)减蓝线值(min_)的差(error,红线)为判断依据,error为正,表示第n名选手用时最短,此时取得r值。那么问题就简化为求error值的最大值。
取三分点m1,m2,若m1的error值大于m2的error值,那么答案就在[L, m2]范围内;否则在[m1, R]范围内。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = ;
int t, n;
double rv[maxn], kv[maxn];
double Judge (double r)
{
double min_ = r/rv[n-]+(t-r)/kv[n-];
double error = 1e100; //
for(int i = ; i < n-; i++)
{
double tmp = r/rv[i]+(t-r)/kv[i];
error = min(error, tmp-min_);
}
return error;
} int main()
{
while(~scanf("%d", &t))
{
scanf("%d", &n); for(int i = ; i < n; i++)
{
scanf("%lf%lf", &rv[i], &kv[i]);
}
double L = 0.0, R = t; bool ok = false;
while(R-L>1e-)
{
double m1 = L + (R-L)/;
double m2 = R - (R-L)/;
//cout << Judge(m1) << " " << Judge(m2) << endl;
if(Judge(m1) > Judge(m2)) R = m2;
else L = m1;
}
double err = Judge(L);
if(err < 0.00)
printf("The cheater cannot win.\n");
else
printf("The cheater can win by %.0lf seconds with r = %.2lfkm and k = %.2lfkm.\n", err*, L, t-L);
}
return ;
}
【三分搜索算法】UVa 10385 - Duathlon的更多相关文章
- UVA 10385 - Duathlon(三分法)
UVA 10385 - Duathlon 题目链接 题意:一些运动员,參加铁人两项,跑步r千米,骑车k千米,如今知道每一个人的跑步和骑车速度,问是否能设置一个r和k,保持r + k = t,使得第n个 ...
- UVA 10385 Duathlon
Problem HDuathlonInput: standard inputOutput: standard outputTime Limit: 15 seconds A duathlon is a ...
- 【单峰函数,三分搜索算法(Ternary_Search)】UVa 1476 - Error Curves
Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a m ...
- 铁人系列 (1) uva 10385
uva 10385 列出n-1个一元方程,对应成单峰函数,所以用三分求解即可. #include <cstdio> #include <cstring> #include & ...
- uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)
题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...
- UVa 1473 - Dome of Circus 三分
把所有的点都映射到XOZ这个平面的第一象限内,则这个三维问题可以转化二维问题: 求一条直线,使所有点在这条直线的下方,直线与X轴和Z轴围成的三角形旋转形成的圆锥体积最小. 这样转化之后可以看出直线的临 ...
- UVA - 1476 Error Curves 三分
Error Curves Josephina is a clever girl and addicted to Machi ...
- 三分初练QAQ
求凸函数的极值的一般方法是三分 三分的思想大概是这样的: 例如我们要求下凸函数的极值 在区间[L,R]上, 我们定义m1为区间的第一个三等分点 定义m2为区间的第二个三等分点 设函数值为F(x) 则若 ...
- UVA 10529 - Dumb Bones(概率+区间dp)
UVA 10529 - Dumb Bones option=com_onlinejudge&Itemid=8&category=518&page=show_problem&am ...
随机推荐
- linux性能问题(CPU,内存,磁盘I/O,网络)
一. CPU性能评估 1.vmstat [-V] [-n] [depay [count]] -V : 打印出版本信息,可选参数 -n : 在周期性循环输出时,头部信息仅显示一次 delay : 两次输 ...
- 虚拟机VMware里 windows server 2003 扩充C盘方法
你会经常用windows server 2003 吗?应该不会吧,有时一些东西必须装在windows server 2003 上才能用,所以 用虚拟机把,好,装在虚拟机上,8G的C盘够你用吗,一个稍微 ...
- shape中的属性大全
首先,看看事例代码 <shape> <!-- 实心 --> <solid android:color="#ff9999"/> <!-- 渐 ...
- 删除链表中全部值为k的节点
1. 问题描写叙述 给定一个单链表,删除当中值为k的全部节点.比如:1→2→6→3→4→5→61 \to 2 \to 6 \to 3 \to 4 \to 5 \to 6,删除当中值为6的节点,返回:1 ...
- stm32上的Lava虚拟机开发进度汇报(3)
感觉遇到一个瓶颈了,这几天都没有什么进度. 前几天把函数和一些最基本的伪指令实现了一下,能跑一点仅使用了绘图函数的lav,但是函数调用的问题一直没解决. 后来发现是粗心漏写了个++,解决了函数调用的问 ...
- Codeforces Gym 100342C Problem C. Painting Cottages 暴力
Problem C. Painting CottagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1 ...
- Asp.Net页面(母版页)加载顺序
ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会 ...
- Android4.4 蓝牙源码部分分析
最近GOOGLE发布了Android4.4,看了一下源码:4.4的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点 ...
- python selenium自动化(二)自动化注册流程
需求:使用python selenium来自动测试一个网站注册的流程. 假设这个网站的注册流程分为三步,需要提供比较多的信息: 在这个流程里面,需要用户填入信息.在下拉菜单中选择.选择单选的radio ...
- 空间的配置和释放 std::alloc
看完了对象的构造行为和内存释放前的对象的析构行为,我们现在来看看内存的配置和释放. 对象构造前的空间分配和析构后的空间释放,定义在头文件<stl_alloc.h>中.其设计思想是: 向sy ...