UVa 10385 - Duathlon

题目:有一个比赛分成跑步和骑车两部分,总长度一定(L),最后的参赛者贿赂了裁判,

裁判会调节两部分的比例,他想要求超过第二名的最大值。

分析:三分求单峰函数最值。设第一部分长度是x,第二部分的长度是L-x,t(x)= x / v +(L-x)/ u;

f(x)= max(x / vn +(L-x)/ un -(x / vi +(L-x)/ ui));

= x / vn +(L-x)/ un -min(x / vi +(L-x)/ ui);

下面证明f(x)为单峰函数(即min(x / vi +(L-x)/ ui)为单峰函数):

首先,只包含两条直线,一定是单峰的函数(或者是单调的);

再次,设i条直线是单峰的,插入第i+1条(如图黄色的直线),那么得到新的函数;

其中,左交点上的直线斜率一定小于li+1,右交点的直线斜率一定大于li+1;

(因为相交后在右侧的斜率大的在上面,左边斜率小的在上面)

由斜率递增的直线段构成的连续分段函数一定单峰(最低点两端都是单调的);

结论,综上f(x)时候单峰函数。

说明:╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int DATA_SIZE = 10001;

double L,u[DATA_SIZE],v[DATA_SIZE];

double F(int n, double x, double L)
{
	double min_value = x/u[1] + (L-x)/v[1];
	for (int i = 2; i < n; ++ i)
		min_value = min(min_value, x/u[i] + (L-x)/v[i]);
	return min_value - x/u[n] - (L-x)/v[n];
}

int main()
{
	int n;
	while (~scanf("%lf%d",&L,&n)) {
		for (int i = 1; i <= n; ++ i)
			scanf("%lf%lf",&u[i],&v[i]);

		double l = 0,r = L,div_l,div_r;
		while (r-l > 1e-4) {
			div_l = l + (r-l)/3.0;
			div_r = r - (r-l)/3.0;
			if (F(n, div_l, L) > F(n, div_r, L))
				r = div_r;
			else l = div_l;
		}

		if (F(n, l, L) < 0)
			printf("The cheater cannot win.\n");
		else {
			printf("The cheater can win by %.0lf",F(n, l, L)*3600);
			printf(" seconds with r = %.2lfkm and k = %.2lfkm.\n",l,L-l);
		}
	}
    return 0;
}
时间: 2024-10-15 02:50:15

UVa 10385 - Duathlon的相关文章

UVA 10385 - Duathlon(三分法)

UVA 10385 - Duathlon 题目链接 题意:一些运动员,参加铁人两项,跑步r千米,骑车k千米,现在知道每个人的跑步和骑车速度,问能否设置一个r和k,保持r + k = t,使得第n个人会取胜,如果可以求出时间和r,k 思路:三分法,把每个人列出一个带r的方程求时间,其他人减去最后一个人就是相差的时间,发现这些方程都是一元一次线性方程,而问题相当于求每个x轴上,值最小的那个,这些线画出来,会发现变成一个上凸函数,是单峰函数,可以用三分法求解 代码: #include <cstdio>

铁人系列 (1) uva 10385

uva  10385 列出n-1个一元方程,对应成单峰函数,所以用三分求解即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 30; int N; double L, vr[maxn], vk[maxn]; void init () { for (int i = 1; i <= N; i++) { vr[i] = 1/

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED

uva 401.Palindromes

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=342 题目意思:给出一段字符串(大写字母+数字组成).判断是否为回文串 or 镜像串 or 回文镜像串 or 什么都不是.每个字母的镜像表格如下 Character Reverse Character Reverse Character Reverse A A M M Y Y B

[2016-02-19][UVA][129][Krypton Factor]

UVA - 129 Krypton Factor Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description You have been employed by the organisers of a Super Krypton Factor Contest in which contestants have very high mental and physica

[2016-02-03][UVA][514][Rails]

时间:2016-02-03 22:24:52 星期三 题目编号:UVA 514 题目大意:给定若干的火车(编号1-n),按1-n的顺序进入车站, 给出火车出站的顺序,问是否有可能存在 分析:    FIFO,用栈模拟一遍即可, 方法:    根据输入的顺序,从1-n开始,当前操作的为i 如果i是当前对应的编号,那么直接跳过(进入B) 如果不是,根据当前需求的编号,小于i,就从栈顶弹出一个元素, 看这个元素是否是需求的,是则继续.否则NO 1 2 3 4 5 6 7 8 9 10 11 12 13