PTA(Advanced Level)1033.To Fill or Not to Fill
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的更多相关文章
- 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 ...
- PAT (Advanced Level) 1033. To Fill or Not to Fill (25)
贪心.注意x=0处没有加油站的情况. #include<cstdio> #include<cstring> #include<cmath> #include< ...
- PTA (Advanced Level) 1004 Counting Leaves
Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to count tho ...
- PTA (Advanced Level) 1003 Emergency
Emergency As an emergency rescue team leader of a city, you are given a special map of your country. ...
- PTA (Advanced Level) 1020 Tree Traversals
Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the ...
- PTA (Advanced Level) 1018 Public Bike Management
Public Bike Management There is a public bike service in Hangzhou City which provides great convenie ...
- PTA(Advanced Level)1025.PAT Ranking
To evaluate the performance of our first year CS majored students, we consider their grades of three ...
- 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 ...
- PTA (Advanced Level) 1008 Elevator
Elevator The highest building in our city has only one elevator. A request list is made up with Npos ...
随机推荐
- js里url里有特殊字符(如&)情况,后台request.getParameter("url")里&变成&
js:encodeURIComponent(url) //用encodeURIComponent转码 java后台:用java.net.URLDecoder.decode((request.getPa ...
- FileInputStream读取的两种方法:逐字节读;以字节数组读取
1:read() : 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值.如果因为已经到达流末尾而没有可用的字节,则返回-1.在输入数据可用.检测到流末尾或者抛出异常前,此方法一直阻塞 ...
- GO111MODULE的设置(及GOPROXY)
环境:win7 go1.13.1 早听说GO111MODULE大名,今天才测试成功,步骤如下: 因为我的Go version >= 1.13,直接用go env -w 设置(注意大小写) go ...
- oracle数据库GROUP BY 子句
1.GROUP BY子句 在SELECT 列表中所有未包含在组函数中的列都应该包含在GROUP BY 子句中. 如下: SELECT deptno,AVG(sal) from emp GROUP BY ...
- 浅谈神经网络中的bias
1.什么是bias? 偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),它其实就是函数的截距,与线性方程 y=wx+b 中的 b ...
- pxe linux 0
操作环境:windows 实验环境:vmware workstation 实验要求:配置一台workstation机器(ip地址192.168.96.100 gateway 192.168.96.2 ...
- cas系列-cas server demo搭建(二)
一 部署简述 cas server官方推荐采用overlay方式进行部署,通过替换自定义文件,减少项目文件改动,以简化开发和部署,这个有点类似于项目上直接替换java的class文件,由于和git的搭 ...
- pwn学习日记Day19 《程序员的自我修养》读书笔记
windows PE/COFF章总结 本章学习了windows下的可执行文件和目标文件格式PE/COFF.PE/COFF文件与ELF文件非常相似,它们都是基于段的结构的二进制文件格式.Windows下 ...
- js的 break 和 continue 计算问题
break和continue: 代码如下: var count=0; outermost: for(var i=0;i<10;i++){ for(var j=0;j&l ...
- Qt:使用Model-View,动态的加载显示数据
共有 main.cpp, Widget.h, Widget.cpp, Widget.ui, MyModel.h, MyModel.cpp 六个文件. 可从此下载整个工程文件: /Files/biao/ ...