A duathlon is a race that involves running r km and cycling k km. n contestants have entered the
race; each contestant has different running and cycling speeds. One of the contestants has bribed the
organizers to set r and k so that he can win by the maximum margin. You are to determine if this is
possible and, if so, give r and k.
Input
The input file contains several sets of input. The description of each set is given below:
The first line of each set contains an integer t, the total distance of the race, in km. That is,
r + k = t. The next line contains an integer n, the number of competitors. For each contestant, a line
follows with two real numbers giving the running and cycling speed for that contestant. The last line
of input gives the running and cycling speed of the contestant who has bribed the organizers. You may
assume t does not exceed 100 km and n does not exceed 20. Input is terminated by end of file. Two
consecutive sets may or may not be separated by a blank line.
Output
For each set of input produce one line of output. The output description for each set is given below:
If it is possible to fix the race as describe above, print a message giving r and k accurate to two
decimal places, and the amount of seconds by which the cheater will win the race, (0 in case some
competitor ties him), as in the sample below. If it is not possible, print ‘The cheater cannot win.’
There is no blank line between outputs for two consecutive sets.
Sample Input
100
3
10.0 40.0
20.0 30.0
15.0 35.0
100
3
10.0 40.0
20.0 30.0
15.0 25.0
Sample Output
The cheater can win by 612 seconds with r = 14.29km and k = 85.71km.
The cheater cannot win.
是个很简单的三分…
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int n;
double chang,t1[21],t2[21];
double f(double theta)
{
double makexi = 1e100;
for (int a = 1; a < n; a++)
{
makexi = min(makexi, theta / t1[a] + (chang - theta) / t2[a]);
}
return -(theta / t1[n] + (chang - theta) / t2[n])+makexi;
}
const double eps = 1e-8;
double Ternary_Calculate(double l, double r) {
double mid, midmid, ans;
while (fabs(r - l)>eps) {
mid = (l + r) / 2;
midmid = (mid + r) / 2;
if (f(mid)<f(midmid)) //求极大值
l = mid;
else
r = midmid;
}
ans = l;
return ans;
}
int main()
{
while (cin >> chang)
{
cin >> n;
for (int a = 1; a <= n; a++)cin >> t1[a] >> t2[a];
double x = Ternary_Calculate(0, chang);
if (f(x) < 0)
printf("The cheater cannot win.\n");
else
printf("The cheater can win by %.0lf seconds with r = %.2lfkm and k = %.2lfkm.\n", f(x) * 3600, x, chang- x);
}
}