1548: Design road (思維題 做法:三分找極值)
1548: Design road
Time Limit: 2 Sec Memory Limit: 256 Mb Submitted: 450 Solved: 237
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.
Each test case contains 5 positive integers N,x,y,c1,c2 in the first line.(N ≤ 1000,1 ≤ x,y≤ 100,000,1 ≤ c1,c2 ≤ 1000).
The following N lines, each line contains 2 positive integer xi, wi ( 1 ≤ i ≤ N ,1 ≤ xi ≤x, xi-1+wi-1 < xi , xN+wN ≤ x),indicate the i-th river(left bank) locate xi with wi width.
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
Hint
Source
給你兩點(0,0) (x,y)
在這兩點之間有n條平行於y軸的河流
修路每單位花費c1,搭橋每單位花費c2
問你到達(x,y)最小的花費是多少 分析:
把所有合河流移動到左邊,所以肯定是直接從(0,0)搭橋到河流對岸的某點(sum,y)
sum是所有河流的寬度
然後從(sum,y)修路到目的地
現在想象一下
整條路徑(包括路和橋)
路的兩端是固定的
中間河流對面某點(sum,y)是不固定的
隨著該點的移動,路徑長度的不同的
所以花費也是不同的
所以找一個合適的y
使得花費最小
極值尋找問題,采用三分
三分尋找合適的y
使得花費最小 註意精度問題
eps10的-3次方夠了 code:
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #include<cctype> #include<stack> #include<sstream> #include<list> #include<assert.h> #include<bitset> #include<numeric> using namespace std; typedef long long LL; #define max_v 1005 #define eps 1e-3 double dis(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main() { int n; double x,y,c1,c2; while(~scanf("%d %lf %lf %lf %lf",&n,&x,&y,&c1,&c2)) { double sum=0,w,x1; for(int i=0;i<n;i++) { scanf("%lf %lf",&x1,&w); sum+=w; } sum=x-sum; double L=0,R=y,mid,mmid; while(R-L>eps) { mid=(L+R)/2.0; mmid=(mid+R)/2.0; double s1=dis(0,0,sum,mid)*c1+dis(sum,mid,x,y)*c2; double s2=dis(0,0,sum,mmid)*c1+dis(sum,mmid,x,y)*c2; if(s1>s2) L=mid; else R=mmid; } printf("%.2lf\n",dis(0,0,sum,mid)*c1+dis(sum,mid,x,y)*c2); } return 0; } /* 題目意思: 給你兩點(0,0) (x,y) 在這兩點之間有n條平行於y軸的河流 修路每單位花費c1,搭橋每單位花費c2 問你到達(x,y)最小的花費是多少 分析: 把所有合河流移動到左邊,所以肯定是直接從(0,0)搭橋到河流對岸的某點(sum,y) sum是所有河流的寬度 然後從(sum,y)修路到目的地 現在想象一下 整條路徑(包括路和橋) 路的兩端是固定的 中間河流對面某點(sum,y)是不固定的 隨著該點的移動,路徑長度的不同的 所以花費也是不同的 所以找一個合適的y 使得花費最小 極值尋找問題,采用三分 三分尋找合適的y 使得花費最小 註意精度問題 eps10的-3次方夠了 */
1548: Design road (思維題 做法:三分找極值)