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: Cma**x (≤ 100), the maximum capacity of the tank; D (≤30000), the distance between Hangzhou and the destination city; Dav**g (≤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: P**i, the unit gas price, and D**i (≤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
思路
  • 贪心策略

    • 优先前往更低油价的加油站(\(K\)):加到刚好能到\(K\)的油量,加更便宜的油
    • 没有更低油价的:在当前油站处加满
    • 没有加油站可以到达的时候:到极限了
  • 每到新的一个加油站都要根据上面的策略做出决策
代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
double pi, di; //价格和到起点的距离
}a[510];
bool cmp(node a, node b)
{
return a.di < b.di;
} int main()
{
double capacity, distance, run_per_gas;
int stations;
cin >> capacity >> distance >> run_per_gas >> stations;
for(int i=0;i<stations;i++)
cin >> a[i].pi >> a[i].di;
a[stations].pi = 0;
a[stations].di = distance; //将重点堪称油价为0,距离起点为D的加油站
sort(a, a+stations, cmp); if(a[0].di != 0) //一开始的油量为0,如果最近的加油站距离不是0那么肯定不行
{
cout << "The maximum travel distance = 0.00\n";
return 0;
}
int pos = 0; //当前所在的加油站
double best_len = capacity * run_per_gas; //满油状态下能走得最远的距离
double gas_owned = 0.0; //当前状态之下有的油量
double cheapest = 0.0; //最后要花费的油钱
while(pos < stations)
{
int next = -1;
double min_price = 2100000000;
for(int i=pos+1;i<=stations && a[i].di - a[pos].di <= best_len;i++) //当前油量能走的最远距离
{
if(a[i].pi < min_price)
{
min_price = a[i].pi;
next = i;
if(min_price < a[pos].pi)
break;
}
}
if(next == -1) break; double need = (a[next].di - a[pos].di) / run_per_gas; //所需油量
if(min_price < a[pos].pi) //加油站k的油价小于当前油价
{
if(gas_owned < need) //油量不足
{
cheapest += (need - gas_owned) * a[pos].pi; //补足然后去下个更便宜的加油站
gas_owned = 0;
}else gas_owned -= need;
}else
{
cheapest += (capacity - gas_owned) * a[pos].pi;
gas_owned = capacity - need;
}
pos = next;
}
if(pos == stations)
printf("%.2f\n", cheapest);
else
printf("The maximum travel distance = %.2f\n", a[pos].di + best_len);
return 0;
}
引用

https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080

PTA(Advanced Level)1033.To Fill or Not to Fill的更多相关文章

  1. PTA(Advanced Level)1036.Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  2. PAT (Advanced Level) 1033. To Fill or Not to Fill (25)

    贪心.注意x=0处没有加油站的情况. #include<cstdio> #include<cstring> #include<cmath> #include< ...

  3. PTA (Advanced Level) 1004 Counting Leaves

    Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to count tho ...

  4. PTA (Advanced Level) 1003 Emergency

    Emergency As an emergency rescue team leader of a city, you are given a special map of your country. ...

  5. PTA (Advanced Level) 1020 Tree Traversals

    Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the ...

  6. PTA (Advanced Level) 1018 Public Bike Management

    Public Bike Management There is a public bike service in Hangzhou City which provides great convenie ...

  7. PTA(Advanced Level)1025.PAT Ranking

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  8. PTA (Advanced Level) 1009 Product of Polynomials

    1009 Product of Polynomials This time, you are supposed to find A×B where A and B are two polynomial ...

  9. PTA (Advanced Level) 1008 Elevator

    Elevator The highest building in our city has only one elevator. A request list is made up with Npos ...

随机推荐

  1. MongoDB 运维实总结

    一.MongoDB 集群简介 MongoDB是一个基于分布式文件存储的数据库,其目的在于为WEB应用提供可扩展的高性能数据存储解决方案.下面将以3台机器介绍最常见的集群方案.具体介绍,可以查看官网 h ...

  2. https 非对称加密

  3. 【线性代数】6-2:对角化(Diagonalizing a Matrix)

    title: [线性代数]6-2:对角化(Diagonalizing a Matrix) categories: Mathematic Linear Algebra keywords: Eigenva ...

  4. 报错 One or more constraints have not been satisfied.

    常出现在导入已有标签时. 需要在<build/><plugins/>里面追加标签 <plugin> <groupId>org.apache.maven. ...

  5. JavaWeb_(Mybatis框架)主配置文件介绍_四

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  6. Memcached 之在win10上的安装

    一.下载 http://static.runoob.com/download/memcached-win64-1.4.4-14.zip 二.安装 memcached <1.4.5 版本安装 1. ...

  7. Pstools使用

    pstool的介绍 PsTools是Sysinternals Suite中一款排名靠前的一个安全管理工具套件.现在被微软收购.目前pstools中含有12款各式各样的小工具.如果将它们灵活的运用,将会 ...

  8. @Transactional注解详细用法

    概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...

  9. oracle中查询某个库中所有的表以及所占的表空间大小

    1. 查某一用户下的表select SEGMENT_NAME,TABLESPACE_NAME,sum(BYTES/1024/1024)||'M' from USER_extents where SEG ...

  10. iOS App的几种安全防范

    虽然公司的项目目前还不算健壮,安全问题对于大部分小公司来说似乎并没什么必要,不过要攻击的话,我有十足的把握,我们是无法承受冲击的.嘿嘿嘿~不过带着一颗入坑iOS的心思,搜集了一下资料后,还是做了一些尝 ...