PAT甲级真题 1033 To Fill or Not to Fill (25分) C++实现(贪心法)

该博客介绍了如何使用贪心算法解决一个关于汽车驾驶路径规划的问题,其中需要考虑油箱容量、加油站价格和距离。博主通过分析测试用例,提出了解决方案:按加油站距离排序,选择最经济的加油策略,以达到目的地。如果无法到达目的地,将输出最大行驶距离。

题目

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

思路

这道题给的测试用例计算太麻烦了,差评。

又做了3个小时。需要彻底理清思路后模拟求解,注意考虑剩余油量。

测试用例1的示意图如下:
示意图
为了统一计算,设终点也有加油站且油价为0,按加油站距离排序,从当前所在位置开始:

  • 若可达范围内有更便宜的加油站,则加油量足够到达第一个比当前便宜的加油站,直接过去,到后油量正好为0;
  • 若可达范围内无更便宜的加油站,则在当前站加满油,去可达范围内最便宜的加油站,到后还有剩余油量。

若起点没有加油站,车开不出去,最远距离=0;若未达到终点且可达范围内无加油站,则终点不可达,输出当前最远距离。

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

struct Station{
   
   
    float p;
    float d;
};
bool cmp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值