【三分搜索算法】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 ...
随机推荐
- 【转】新建maven工程为什么jdk会是默认版本 而不是自己设置的版本?
原文链接:为什么我eclipse新建项目的时候默认的是JRE1.5? 修改Maven中conf目录里的setting.xml文件内容,加上如下内容: <profiles> <!-- ...
- Spring Auto proxy creator example
In last Spring AOP examples – advice, pointcut and advisor, you have to manually create a proxy bean ...
- poj 1847 Tram
http://poj.org/problem?id=1847 这道题题意不太容易理解,n个车站,起点a,终点b:问从起点到终点需要转换开关的最少次数 开始的那个点不需要转换开关 数据: 3 2 1// ...
- [iOS微博项目 - 1.8] - 各种尺寸图片加载 & 控件不显示研究
A. 图片的加载: [UIImage imageNamed:@"home"]; 加载png图片 一.非retina屏幕 1.3.5 inch(320 x 480) * ...
- [Xcode使用 - 3] 复制Xcode5.1.1中的项目模板到Xcode6.1
由于Xcode6中精简了许多的项目和文件模板,导致开发非常不方便,所以这里简单介绍了怎么复制旧版本Xcode中的模板到新的Xcode中 这里要复制的是项目模板Empty Appli ...
- UVA10361 - Automatic Poetry
“Oh God”, Lara Croft exclaims, “it’s one of these dumb riddles again!” In Tomb Raider XIV, Lara is, ...
- MFC编辑框换行实现
MFC中换行实现 在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即“\r\n”,用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性: ...
- hashCode()和equals()的用法
使用hashCode()和equals() hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. hashCode()方法 ...
- 创建类模式(三):创建者(Builder)
定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这使得构件算法和组装方式可以独立应对变化:复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式 ...
- matlab eps中文乱码的解决方法
直接存成eps总是乱码 最优解决方法是matlab print 保存成jpg,之后用adobe acrobat pro 打开jpg文件另存为eps