zoukankan      html  css  js  c++  java
  • 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 }

  • 相关阅读:
    gitlab使用
    小程序顶部导航栏标题不居中
    mpvue中使用vant-weapp
    原生js实现轮播图
    vue无法检测数组的变动
    vue报错TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function
    vue绑定style使用需要添加浏览器引擎前缀的 CSS 属性
    《孙子算经》之"物不知数"题:中国剩余定理
    Java大数处理类:BigInteger类和BigDecimal类
    【转】操作系统典型调度算法
  • 原文地址:https://www.cnblogs.com/bochen-sam/p/3379375.html
Copyright © 2011-2022 走看看