铁人系列 (1) uva 10385

时间:2023-12-30 16:14:14

uva  10385

列出n-1个一元方程,对应成单峰函数,所以用三分求解即可。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = ; int N;
double L, vr[maxn], vk[maxn]; void init () {
for (int i = ; i <= N; i++) {
vr[i] = /vr[i] - /vk[i];
vk[i] = L/vk[i];
} for (int i = ; i < N; i++) {
vr[i] -= vr[N];
vk[i] -= vk[N];
}
} double f (double x) {
double ret = vr[] * x + vk[];
for (int i = ; i < N; i++)
ret = min(ret, vr[i] * x + vk[i]);
return ret;
} double tsearch (double l, double r) {
for (int i = ; i < ; i++) {
double p = l + (r - l) / ;
double q = r - (r - l) / ;
if (f(p) > f(q))
r = q;
else
l = p;
}
return l;
} int main () {
while (scanf("%lf%d", &L, &N) == ) {
for (int i = ; i <= N; i++)
scanf("%lf%lf", &vr[i], &vk[i]);
init();
double x = tsearch(, L);
if (f(x) < )
printf("The cheater cannot win.\n");
else
printf("The cheater can win by %.0lf seconds with r = %.2lfkm and k = %.2lfkm.\n", f(x) * , x, L-x);
}
return ;
}