题目链接:http://www.patest.cn/contests/pat-a-practise/1033

题目:

1033. To Fill or Not to Fill (25)

时间限制
10 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
ZHANG, Guochuan

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)的更多相关文章

  1. 【贪心】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 ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. PAT甲级1033. To Fill or Not to Fill

    PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. [Leetcode][Python]55: Jump Game

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 55: Jump Gamehttps://leetcode.com/probl ...

  2. 分治法求一个N个元素数组的逆序数

    背景  逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...

  3. 【转】C++容器类

    C++容器类 C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等:后者包括set,map,multiset,multimap等. 若需要存储的元素数在 ...

  4. 记录一个原因不明的段错误(libxml2 proc activemq的三角恋)

    又碰到了令人头疼的段错误,但是这次,虽然最终找到了出自何处,但是还是不明白究竟是为何. 最后将程序简化,贴上来,希望高人能指点一下. memt.pc: #include <libxml/pars ...

  5. RehHat enterprise 5.4 安装git

    今天想来研究一下git,就自己安装一个试试,没想到遇到各种问题.经过各种百度和google,终于都解决了,现在来总结一下: 1.安装完redhat 5.4,安装gcc编译器的问题:这个gcc编译器需要 ...

  6. Unity 梯子生成算法

    Unity之生成梯子算法的实现. 1.通过预制物体动态生成角度可设置的梯子形状. 1.1 主要涉及到的数学知识点,角度与弧度的转化. 弧度=角度乘以π后再除以180 角度=弧度除以π再乘以180 1. ...

  7. EF MySQL 提示 Specified key was too long; max key length is 767 bytes错误

    在用EF的CodeFirst操作MySql时,提示 Specified key was too long; max key length is 767 bytes错误,但数据库和表也建成功了.有高人知 ...

  8. HTML中IE条件注释判断语句(<!--[if XX IE X]><![endif]-->)

    <!--[if XX IE X]><![endif]-->是IE专门提供的一种语法,其他浏览器会将其作为注释而忽略这些语句.   作用: 根据不同的IE版本加载对应的CSS或者 ...

  9. localStorage和sessionStorage火狐浏览器和其他高级浏览器的区别

    例子: <script>window.onload=function(){ var oSetData = document.getElementById('setData'); var o ...

  10. django学习笔记二:一个项目多个App项目搭建

    django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...