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. pyecharts 开发文档

    pyechart 新 版本 https://pyecharts.org/#/zh-cn/quickstart pyecharts 老版本 https://05x-docs.pyecharts.org/ ...

  2. java监测硬盘空间大小

    package com.zuidaima.util.file; import java.io.File; public class FreeDiskSpace { public static void ...

  3. 解决InputStream中数据读取不完整问题

    转载:https://blog.csdn.net/lilidejing/article/details/37913627 当需要用到InputStream获取数据时,这时就需要读取InputStrea ...

  4. Win内核原理与实现学习笔记2-现代操作系统的基本结构

    1.操作系统本属于软件的范畴,但它需要紧密的跟硬件打交道,它为上层应用软件或应用系统提供了一层抽象,专门负责硬件资源的管理和分配.(应用程序不需要跟硬件打交道,它们利用操作系统提供的功能来实现各种任务 ...

  5. java代理,手把手交你写java代理

    一:常用的java代理模式 一般经常做java开发的知道java的代理模式一共有三种,第一种也就是静态代理,这种用法比较简单,没有什么魔法棒,比较好理解,另外两种分别是JDK代理和cglib代理,他们 ...

  6. Linux设备驱动程序 之 软中断

    软中断保留给系统中对时间要求严格以及最重要的下半部使用:目前,只有两个子系统(网络和SCSI)直接使用软中断:此外,内核定时器和tasklet都是建立在软中断上的:在使用软中断之前,要先确定为什么不能 ...

  7. vue实现穿梭框效果

    vue实现穿梭框效果 一.总结 一句话总结: 用两个数组分别记录左右框框里面的值,用两个数组绑定checkbox,用来记录选中的checkbox值,根据选中的checkbox的值实现删除增加即可 1. ...

  8. 使 nodejs 代码 在后端运行(forever)

    情境 运行nodejs的程序,使用命令:node xxx.js,但是关掉终端,程序也关闭了,如何让node app的程序一直运行? 解决 1.安装forever npm install -g fore ...

  9. 交互式绘图工具gunplot

    Gnuplot是一个命令行的交互式绘图工具(command-driven interactive function plotting program).用户通过输入命令,可以逐步设置或修改绘图环境,并 ...

  10. Linux 之Shell for循环

    @代表所有参数所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng $poo -le ${#prodlist[@]} 这句话是说 $poo小于等于prodlist中的 ...