• 1033. To Fill or Not to Fill (25)


     题目链接:http://www.patest.cn/contests/pat-a-practise/1033

    题目:

    1033. To Fill or Not to Fill (25)

    时间限制
    10 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    ZHANG, Guochuan

    With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<= 100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,...N. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print "The maximum travel distance = X" where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

    Sample Input 1:
    50 1300 12 8
    6.00 1250
    7.00 600
    7.00 150
    7.10 0
    7.20 200
    7.50 400
    7.30 1000
    6.85 300
    
    Sample Output 1:
    749.17
    
    Sample Input 2:
    50 1300 12 2
    7.10 0
    7.00 600
    
    Sample Output 2:
    The maximum travel distance = 1200.00

    分析:

    把不能到达和能到达分开讨论,特别要注意不能到达分为(1),中间距离大于满邮箱的行驶距离(2),起点没有加油站。


    在其余的情况的都是能到达终点的,那么选择油费最小的策略就是:在当前加油站到满油箱行驶距离中的加油站中,假设有油价比当前油价小的S加油站,则仅仅加油到满足S加油站的地方。然后从S加油站继续寻找。假设没有找到比当前油站油价小的。则在当前加油站加满油。行驶到下一油站继续寻找。

    AC代码:

    #include<stdio.h>
    #include<algorithm>
    #include<vector>
    using namespace std;
    struct Station{
     double price;
     double location;
     bool operator <(const Station &A)const{
      return location < A.location;
     }
    };
    vector<Station>V;
    int main(void){
     //freopen("F://Temp/input.txt", "r", stdin);
     int C, D, dis_per, N;
     scanf("%d%d%d%d", &C, &D, &dis_per, &N);
     for (int i = 0; i < N; i++){
      Station tmp;
      scanf("%lf %lf", &tmp.price, &tmp.location);
      V.push_back(tmp);
     }
     Station tmp;
     tmp.location = D;
     tmp.price = 0;
     V.push_back(tmp);//join the Destination to the Station ,As the price = 0;
     sort(V.begin(), V.end());
     double distance1time = C * dis_per;//满油箱行驶的距离
     for (int i = 0; i <V.size() - 1; i++){
      if (V[0].location > 0){//假设起点没有加油站,则最远距离就是0。这是一个測试点
       printf("The maximum travel distance = 0.00
    ");
       return 0;
      }
      if (V[i + 1].location - V[i].location > distance1time){//假设两个加油站的距离大于满油箱的距离
       double max;
       max = V[i].location + distance1time;
       printf("The maximum travel distance = %.2lf
    ", max);
       return 0;
      }
     }//The situation that the car can't reach the Destination.
     double remain, money, distance;
     remain = 0; money = 0; distance = 0;
     int now_Station = 0, next_Station;
     while (distance < D){
      next_Station = -1;
      for (int i = now_Station + 1; i < V.size(); i++){//寻找到下一个比当前加油站油价小的加油站
       if (V[i].location - V[now_Station].location >distance1time)break;
       else if (V[i].price <= V[now_Station].price){
        next_Station = i;
        break;
       }
      }
      if (next_Station != -1){//找到了更廉价的加油站
       double dis_tmp = V[next_Station].location - V[now_Station].location;
       distance = V[next_Station].location;
       if (remain > dis_tmp / dis_per){//假设当前的油够开到那个更廉价的加油站,则不用加油
        remain = remain - dis_tmp / dis_per;
        money = money;
       }//have enough gas
       else{//假设油不够开到更廉价的加油站。则加到能刚好开到那个加油站的油就好
        money += (dis_tmp / dis_per - remain)* V[now_Station].price;
        remain = 0;
       }//gas is not enough
       now_Station = next_Station;
      }//find the cheaper station
      else{//假设没有找到,即当前加油站是能行驶到的路程中油价最小的加油站
       double dis_tmp = V[now_Station + 1].location - V[now_Station].location;
       distance = V[now_Station + 1].location;
       money += (C - remain) * V[now_Station].price;//那么就把油箱加满
       remain = C - dis_tmp / dis_per;
       now_Station++;
      }//can't find the cheaper one ,so full the tank;
     }//while
     printf("%.2lf
    ", money);
     return 0;
    }


    截图:


    ——Apie陈小旭

  • 相关阅读:
    纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!
    纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
    FineUI v3.3.1 发布了!
    FineUI参考手册(离线版)现已免费提供下载!
    #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!
    FineUI有三篇文章同时上博客园首页10天内推荐排行,难得啊!
    记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客!
    如何优化 FineUI 控件库的性能,减少 80% 的数据上传量!
    我在 CSDN 的小窝
    2017年IT行业测试调查报告
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5222385.html
Copyright © 2020-2023  润新知