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 }

posted @ 2013-10-20 19:41  coding_monkey  阅读(376)  评论(0编辑  收藏  举报