• 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 }
  • 相关阅读:
    Android 中的通知
    Android 画图之Matrix(二)
    Android 画图之 Matrix(一)
    Android 实现书籍翻页效果(转载链接)
    Android 基于TranslateAnimation 的动画动态菜单(非系统menu菜单)
    Activity 页面切换的效果
    Android 访问本地API doc较慢
    Eclipse插件工具
    Android 性能优化的一些方法
    Android JAVA代码执行shell命令
  • 原文地址:https://www.cnblogs.com/Aldorado/p/5232779.html
Copyright © 2020-2023  润新知