1033 to fill or not to fill

贪心算法

注意两点:

1、sum用double类型

2、第二个测试点是起点没有加油站的情况

AC代码

  1 #include <vector>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <map>
  5 using namespace std;
  6 class gas{
  7 public:
  8     double p;
  9     double d;
 10 };
 11 bool operator<(const gas& a,const gas& b){
 12     return a.d < b.d;
 13 }
 14 int main(){
 15     int c,d,avg,n;
 16     scanf("%d %d %d %d",&c,&d,&avg,&n);
 17     double D(c * avg);
 18     vector<gas> g;
 19     map<double,gas> minG; 
 20     for(int i = 0;i < n;i++){
 21         gas tmp;
 22         scanf("%lf %lf",&tmp.p,&tmp.d);
 23         if(minG.find(tmp.d) == minG.end() || minG[tmp.d].p > tmp.p)
 24             minG[tmp.d] = tmp;
 25     }
 26     for(map<double,gas>::iterator ite = minG.begin();ite != minG.end();ite++){
 27         g.push_back(ite->second);
 28     }
 29     //sort(g.begin(),g.end());
 30     int currentId(0);
 31     float rem(0);
 32     double sum(0);
 33     if(g[0].d > 0){
 34         printf("The maximum travel distance = 0.00
");
 35         return 0;
 36     }
 37     for(int i = 0;i < g.size();i++){
 38         if(i != g.size() - 1){
 39             if(g[i + 1].d < d && g[i + 1].d - g[i].d > D || g[i + 1].d > d && d - g[i].d > D){
 40                 printf("The maximum travel distance = %.2lf
",g[i].d + D);
 41                 return 0;
 42             }
 43             if(g[i].d + D >= d){
 44                 int j;
 45                 for(j = i + 1;j < g.size() && g[j].d < d;j++){
 46                     if(g[j].p < g[i].p)
 47                         break;
 48                 }
 49                 if(j == g.size() || g[j].p >= g[i].p){
 50                     if(rem >= d - g[i].d)
 51                         printf("%.2lf
",sum);
 52                     else
 53                         printf("%.2lf
",sum + (d - g[i].d - rem) / avg * g[i].p);
 54                     return 0;
 55                 }
 56             }
 57             int j;
 58             bool s1(false);
 59             double minP;
 60             int minId;
 61             for(j = i + 1;j < g.size() && g[j].d <= g[i].d + D;j++){
 62                 if(j == i + 1 || g[j].p < minP){
 63                     minP = g[j].p;
 64                     minId = j;
 65                 }
 66                 if(g[j].p < g[i].p){
 67                     if(rem < g[j].d - g[i].d){
 68                         sum += (g[j].d - g[i].d - rem) / avg * g[i].p ;
 69                         rem = 0;
 70                         i = j - 1;
 71                         s1 = true;
 72                         break;
 73                     }
 74                 }
 75             }
 76             if(s1) continue;
 77             if(j != g.size()){
 78                 sum += (D - rem) / avg * g[i].p;
 79                 rem = D - (g[minId].d - g[i].d);
 80                 i = minId - 1;
 81             }
 82             else{
 83                 if(g[j - 1].p < g[i].p){
 84                     if(g[j - 1].d - g[i].d > rem){
 85                         sum += (g[j - 1].d - g[i].d - rem) / avg * g[i].p;
 86                         rem = 0;
 87                         i = j - 2;
 88                     }
 89                     else{
 90                         rem -= g[j - 1].d - g[i].d;
 91                         i = j - 2;
 92                     }
 93                 }
 94                 else{
 95                     sum += (D - rem) / avg * g[i].p;
 96                     rem = D - (g[j - 1].d - g[i].d);
 97                     i = j - 2;
 98                 }
 99             }
100             continue;
101         }
102         else{
103             if(g[i].d < d - D){
104                 printf("The maximum travel distance = %.2lf
",g[i].d + D);
105                 return 0;
106             }
107             else{
108                 if(rem >= d - g[i].d)
109                     printf("%.2lf
",sum);
110                 else
111                     printf("%.2lf
",sum + (d - g[i].d - rem) / avg * g[i].p );
112                 return 0;
113             }
114         }
115     }
116 }
原文地址:https://www.cnblogs.com/Aldorado/p/5232779.html