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)
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\n");
return 0;
}
if (V[i + 1].location - V[i].location > distance1time){//假设两个加油站的距离大于满油箱的距离
double max;
max = V[i].location + distance1time;
printf("The maximum travel distance = %.2lf\n", 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\n", money);
return 0;
}
截图:
——Apie陈小旭
1033. To Fill or Not to Fill (25)的更多相关文章
- 【贪心】PAT 1033. To Fill or Not to Fill (25)
1033. To Fill or Not to Fill (25) 时间限制 10 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 ZHANG, Gu ...
- 1033 To Fill or Not to Fill (25 分)
1033 To Fill or Not to Fill (25 分) With highways available, driving a car from Hangzhou to any other ...
- PAT 甲级 1033 To Fill or Not to Fill (25 分)(贪心,误以为动态规划,忽视了油量问题)*
1033 To Fill or Not to Fill (25 分) With highways available, driving a car from Hangzhou to any oth ...
- PAT 1033 To Fill or Not to Fill[dp]
1033 To Fill or Not to Fill(25 分) With highways available, driving a car from Hangzhou to any other ...
- pat1033. To Fill or Not to Fill (25)
1033. To Fill or Not to Fill (25) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 ZHANG, Gu ...
- 1033 To Fill or Not to Fill
PAT A 1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other ...
- PAT甲级1033. To Fill or Not to Fill
PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...
- PAT甲级——1033 To Fill or Not to Fill
1033 To Fill or Not to Fill With highways available, driving a car from Hangzhou to any other city i ...
- PAT_A1033#To Fill or Not to Fill
Source: PAT A1033 To Fill or Not to Fill (25 分) Description: With highways available, driving a car ...
随机推荐
- python中的那些“神器”
"武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋",这是神器.不过今天要说的python中的"神器"就没有这么厉害了,这里要说的"神器&q ...
- Android中实现静态的默认安装和卸载应用
近期好长时间都没有写blog了,主要是由于近期工作上的事以及下载Android源代码的事耽误的(下载源代码这件事会在兴许的blog中写道.这个真的非常有意义呀~~),那么今天来写点什么呢?基本的灵感来 ...
- smaba服务的搭建
一. samba配置1. 什么是sambaSamba服务类似于windows上的共享功能,可以实现在Linux上共享文件,windows上访问,当然在Linux上也可以访问到.是一种在局域网上共享文件 ...
- 关于ASP.NET 中站点地图sitemap 的使用
在ASP.NET MVC 如此火热的时期,我竟然不适时宜的谈起ASP.NET ,恐怕会引来一阵嘲笑.最为无趣的是,讲解的竟然还是其中的一个控件.oh~~ my god!my out! ^_^ Si ...
- intellj idea maven 无效的目标发行版: 1.8
File ->settings->maven->runner->jre -> jdk1.8
- python基础之 list和 tuple(元组)
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...
- 从汇编看c++中的虚拟继承及内存布局(二)
下面是c++源码: class Top {//虚基类 public: int i; Top(int ii) { i = ii; } virtual int getTop() { cout <&l ...
- linux 内核开发基础
开发特点 不需要第三方库支持 使用GNU C 没有内存保护机制 杜绝浮点数 栈区固定 必须关注并发及同步 注意可移植性
- jQuery 验证实例(shopnc二次开发)
shopnc 商家用户实现添加用户与前台用户分离, jQuery 验证实例 equalTo:等于 <div id="saleRefund" show_id="1&q ...
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...