| Design road |
| Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB |
| Total submit users: 9, Accepted users: 9 |
| Problem 13267 : Special judge |
| Problem description |
![]() You need to design road from (0, 0) to (x, y) in plane with the lowest cost. Unfortunately, there are N Rivers between (0, 0) and (x, y).It costs c1 Yuan RMB per meter to build road, and it costs c2 Yuan RMB per meter to build a bridge. All rivers are parallel to the Y axis with infinite length. |
| Input |
|
There are several test cases. |
| Output |
|
For each the case, your program will output the least cost P on separate line, the P will be to two decimal places . |
| Sample Input |
1 300 400 100 100 100 50 1 150 90 250 520 30 120 |
| Sample Output |
50000.00 80100.00 |
| Judge Tips |
|
——Dr.Wu |
| Problem Source |
| HNU Contest |
分析:合并一下所有河流与所有陆地,三分河流与陆地交界线的高度。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1005;
typedef long long LL;
const int INF = 0xfffffff;
const double EPS = 1e-8;
double N, x, y, c1, c2;
double River;
double f(double h)
{
return sqrt(River*River + h*h)*c2 + sqrt((x - River)*(x - River) + (y-h)*(y-h))*c1;
}
double ternary(double L, double R)
{
while (R - L > EPS)
{
double mid1 = L + (R - L) / 3;
double mid2 = R - (R - L) / 3;
if (f(mid1) < f(mid2))
R = mid2;
else
L = mid1;
}
return f((L + R) / 2);
}
int main()
{
//freopen("f:\\input.txt", "r", stdin);
while (~scanf("%lf%lf%lf%lf%lf", &N, &x, &y, &c1, &c2))
{
River = 0;
for (int i = 0; i < N; i++)
{
double l, w;
scanf("%lf%lf", &l, &w);
River += w;
}
double ans = ternary(0, y);
printf("%.2f\n", ans);
}
return 0;
}

本文介绍了一种算法,用于在存在多条平行河流的情况下,计算从起点到终点建造道路及桥梁所需的最低成本。通过三分法搜索最优高度,实现对河流与陆地交界处的最佳路径规划。


被折叠的 条评论
为什么被折叠?



