题意:给你起点(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 ",ans); 61 } 62 return 0; 63 }