PAT1033
题目大意:http://pat.zju.edu.cn/submissions/246063
用贪心算法:贪心思路如下:
首先对输入数据按距离升序排序,从A站点开始,记加满油后最大行驶距离为max, 从A站点到A+max距离内搜索:
1. 若搜索到第一个油价小于A的站点,则在A加油量为刚好保证能从A走到该站点。
2. 若没有1里面的站点但是有终点,则A加油量为刚好保证能从A走到该终点。
3. 若不是1,2情况但是此范围内有别的加油站,则在A加满油走到那些站点中油价最低的一个。
4. 不是1,2,3情况,肯定是在此范围为没有任何站点,则最大行驶距离为A+max.
注意: 第2个case是陷阱,没有距离为0的站点,则汽车无法行驶。 油量不一定是整数! 注意记录剩余油量!
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<iomanip> 5 using namespace std; 6 7 8 struct Node 9 { 10 double distance; 11 double gas_price; 12 }; 13 14 bool comp(Node n1, Node n2) 15 { 16 if(n1.distance < n2.distance) 17 return true; 18 else 19 return false; 20 } 21 22 void greedy_algorithm(vector<Node> &v, double C, double D, double S) 23 { 24 double range = C*S; 25 double sum(0); 26 double pos(0); 27 /*剩余油量*/ 28 double remain(0); 29 /*陷阱*/ 30 if(v[0].distance != 0) 31 { 32 cout<<fixed<<setprecision(2)<<"The maximum travel distance = " 33 <<(double)0<<endl; 34 return; 35 } 36 while(1) 37 { 38 double target(-1), minp(99999999); 39 for(double i=pos+1; i<v.size(); ++i) 40 { 41 if(v[i].distance <= v[pos].distance + range) 42 { 43 /*情况1*/ 44 if(v[i].gas_price < v[pos].gas_price && v[i].distance != D) 45 { 46 target = i; break; 47 } 48 /*情况3*/ 49 else if(v[i].gas_price < minp && v[i].distance != D) 50 { 51 minp = v[i].gas_price; 52 target = i; 53 } 54 /*情况2*/ 55 else if(v[i].distance == D) 56 { 57 double need = (D-v[pos].distance)/S - remain; 58 if(need > 0) 59 sum += need*v[pos].gas_price; 60 cout<<fixed<<setprecision(2)<<sum<<endl; 61 return; 62 } 63 } 64 /*情况4*/ 65 else if(i == pos+1) 66 { 67 cout<<fixed<<setprecision(2)<<"The maximum travel distance = " 68 <<v[pos].distance + range<<endl; 69 return; 70 } 71 else 72 break; 73 } 74 /*情况1的油价处理*/ 75 if(v[target].gas_price < v[pos].gas_price) 76 { 77 double need = (v[target].distance - v[pos].distance)/S - remain; 78 if(need > 0) 79 { 80 sum += need*v[pos].gas_price; 81 remain = 0; 82 } 83 else 84 { 85 remain = -need; 86 } 87 pos = target; 88 } 89 /*情况3的油价处理*/ 90 else 91 { 92 double need = C - remain; 93 sum += need*v[pos].gas_price; 94 remain = C - (v[target].distance - v[pos].distance)/S; 95 pos = target; 96 } 97 } 98 } 99 100 int main() 101 { 102 double C,D,S,N; 103 while(cin>>C>>D>>S>>N) 104 { 105 vector<Node> v(N+1); 106 for(double i=0; i<N; ++i) 107 cin>>v[i].gas_price>>v[i].distance; 108 v[N].distance = D; 109 v[N].gas_price = 99999999; 110 sort(v.begin(), v.end(), comp); 111 greedy_algorithm(v, C, D, S); 112 } 113 return 0; 114 }