博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10385 - Duathlon(三分法)
阅读量:4511 次
发布时间:2019-06-08

本文共 1183 字,大约阅读时间需要 3 分钟。

UVA 10385 - Duathlon

题意:一些运动员,參加铁人两项,跑步r千米,骑车k千米,如今知道每一个人的跑步和骑车速度,问是否能设置一个r和k,保持r + k = t,使得第n个人会取胜,假设能够求出时间和r,k

思路:三分法,把每一个人列出一个带r的方程求时间,其它人减去最后一个人就是相差的时间,发现这些方程都是一元一次线性方程,而问题相当于求每一个x轴上,值最小的那个,这些线画出来,会发现变成一个上凸函数,是单峰函数,能够用三分法求解

代码:

#include 
#include
#include
using namespace std;const int N = 25;double t, v1[N], v2[N];int n;double cal(double r) { double k = t - r; double ans = 1e100; double t1 = r / v1[n - 1] + k / v2[n - 1]; for (int i = 0; i < n - 1; i++) { double t2 = r / v1[i] + k / v2[i]; ans = min(ans, t2 - t1); } return ans;}int main() { while (~scanf("%lf", &t)) { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%lf%lf", &v1[i], &v2[i]); double l = 0, r = t; for (int i = 0; i < 100; i++) { double midl = (l * 2 + r) / 3; double midr = (l + r * 2) / 3; if (cal(midl) > cal(midr)) r = midr; else l = midl; } double ti = cal(l); if (cal(l) < 0.00) printf("The cheater cannot win.\n"); else printf("The cheater can win by %.0lf seconds with r = %.2lfkm and k = %.2lfkm.\n", ti * 3600, l, t - l); } return 0;}

转载于:https://www.cnblogs.com/gcczhongduan/p/4042868.html

你可能感兴趣的文章
第一次写博客用来记录自己的工程师生涯。
查看>>
python输出转义字符
查看>>
java基础43 IO流技术(输入字节流/缓冲输入字节流)
查看>>
ASP.NET那点不为人知的事(四)
查看>>
☆ [HNOI2012] 永无乡 「平衡树启发式合并」
查看>>
git 常用命令
查看>>
Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化...
查看>>
ES6--4.解构赋值
查看>>
CCF系列之图像旋转(201503-1)
查看>>
edit.h 再转换到 VS2010 的问题
查看>>
POJ 3134 Power Calculus ★(记录状态的BFS)
查看>>
POJ 3678 Katu Puzzle(POJ 六道2-SAT之一)
查看>>
面向对象初识
查看>>
LeetCode: Find All Duplicates in an Array
查看>>
免费计算机编程类中文书籍
查看>>
mysql之TIMESTAMP(时间戳)用法详解
查看>>
JS笔记——Function类型(JS笔记系列)
查看>>
抽象类入门常见错误
查看>>
javascript修改html <b>标签里面的内容
查看>>
open live writer安装以及代码高亮、折叠插件安装
查看>>