题目链接: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. Linux MySql安装步骤

    本文将以MySQL 5.5.47为例,以CentOS 6.5为平台,讲述MySQL数据库的安装和设置. 源码包方式安装 1.新建MySql用户和用户组 groupadd mysql useradd - ...

  2. ESCAPE用法

    ESCAPE用法1.使用 ESCAPE 关键字定义转义符: 在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符. 2.ESCAPE 'escape_character' 允许在字符串中搜索通 ...

  3. Mac 删除Openfire

    首先,确保你已经关掉了openfire 打开终端 (在应用程序-->实用工具-->) 输入以下命令 sudo rm -rf /Library/PreferencePanes/Openfir ...

  4. Animate.css 教程

    animate.css 是一个有趣,酷炫的,跨浏览器的动画库,你可以将它用于你的项目中.不管是主页,滑动切换,又或者是其它方面,你都可以通过它来制作出惊人的效果. 基本用法 引入CSS文件 这个对你来 ...

  5. python3 module中__init__.py的需要注意的地方

    网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了. 若有需要.请各位看官去搜搜即可. 最近刚开始用Python3 就遇到了这个比较有意思的事情 闲言少叙,下面要介绍的是pyt ...

  6. apache如何在虚拟主机中实现用户验证

    1,在相应的虚拟主机配置文件段,加入<Directory  /data/www.admin.php>                AllowOverride AuthConfig     ...

  7. java学习之Date的使用

    Date使用,主要要注意将日期格式化,否则返回的是系统默认的格式.请自己查阅API文档. import java.util.*; import java.text.*; public class Te ...

  8. JQ图片跟着鼠标走

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Java通过axis调用WebService

    上午头给了我一个任务,让我对接别的公司的webservice接口,各种百度,看的头晕脑花的,终于通了,记录一下吧. jar包奉上,http://pan.baidu.com/s/1jSchC 包含:ax ...

  10. 判断浏览器IE6

    <!--[if lte IE 6]><LINK rel="stylesheet" type="text/css" href="ima ...