题意:给你起点(0,0),终点(x,y),中间有很多条河, 在河上面建桥花费c1,在陆地建路花费c2,问你最小花费是多少。

解题思路:我们知道,我们考虑的时候完全可以把河都移动到一边来求,这样只需要三分就行了。

解题代码:

 

 1 // File Name: b.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月28日 星期六 13时26分39秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 
26 using namespace std;
27 int n , x, y , c1,c2;
28 int tsum;
29 double ans ;
30 double dis(double x1,double y1,double x2,double y2)
31 {
32    return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
33 }
34 void fen(double low ,double high)
35 {
36    double mid1 = low + (high - low) *1/3; 
37    double mid2 = low + (high - low) *2/3;
38    double ansmid1 =dis(0,0,tsum,mid1)*c2 + dis(tsum,mid1,x,y)*c1; 
39    double ansmid2 =dis(0,0,tsum,mid2)*c2 + dis(tsum,mid2,x,y)*c1; 
40    if(fabs(ansmid2-ansmid1) < 1e-6)
41    {
42        ans = ansmid2;
43        return;
44    }
45    if(ansmid1 < ansmid2)
46      fen(low,mid2);
47    else fen(mid1,high);
48 }
49 int main(){
50    while(scanf("%d %d %d %d %d",&n,&x,&y,&c1,&c2) != EOF) 
51    {
52        int tx, ty ;
53        tsum = 0 ; 
54        for(int i = 1;i<= n ;i++)
55        {
56          scanf("%d %d",&tx,&ty);
57          tsum += ty;
58        }
59        fen(0,y);
60        printf("%.2f\n",ans);
61    }
62 return 0;
63 }
View Code

 

posted on 2015-03-29 09:02  dark_dream  阅读(146)  评论(0编辑  收藏  举报