模拟
先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站
0 1 2 3 4 5 6 7 8
7.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 0
0 150 200 300 400 600 1000 1250 1300
车子加满了最多开50*12=600的距离
0.
第0个加油站600以内中,找有没有比7.1小的
找到7.0,那么只需要加跑150距离的汽油即可
费用(150/12)*7.1=88.75
到第1个加油站

1.
同样往后600距离内找比7.0小的
找到6.85,那么只需要加跑300-150距离的汽油即可
费用(150/12)*7.0=87.5
到达第3个加油站

3.
往后600内找有没有比6.85小的
没有,那么就找出其中最小的,第4个和第5个中最小的是7.0
所以在第3个加油站把汽油都加满
费用50*6.85=432.5
跑到第5个加油站

5.
往后600以内有没有比7.0小的
没有,那么找出其中最小的,只有第6个
那么在第5个加油站把油加满
由于从第3个到第5个加油站用了300/12=25的汽油
还剩25,所以加满的费用为
25*7.0=175
跑到第6个加油站

6.
往后600以内比7.3小的有6.0
那么油只要加到能跑到第7个加油站为止,距离为250
第5个跑到第6个加油站,跑了400,汽油还能跑200
所以只需加跑50距离的汽油即可
50/12*7.3=30.417
跑到第7个加油站

7.
往后找比6.0小的,即为第8个加油站
(这就是为什么在最后添加一个加油站的原因了)
只需要加跑50距离的汽油量
费用50/12*6=25
跑到第8个加油站,结束

总费用加起来,保留两位小数为749.17

照着这个思路,代码就能写出来了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=;
int capacity,dis,davg;
int n;
struct Gas{
double price;
int dis;
bool operator<(const Gas tmp)const{
return dis<tmp.dis;
}
}gas[maxn];
int main()
{
scanf("%d %d %d %d",&capacity,&dis,&davg,&n);
for(int i=;i<n;i++){
scanf("%lf %d",&gas[i].price,&gas[i].dis);
}
sort(gas,gas+n);
//最后一个设置为目的地,价格为0
gas[n].price=;
gas[n].dis=dis;
int maxdrive=capacity*davg; //能开的最大距离
int driveDis;
int leftdrive=; //跑到下一个加油站后,还能再跑多少的距离
int now=; //车所在的距离
double sum=;
for(int i=;i<n;i++){
if(now==gas[i].dis)
driveDis=maxdrive;
else
break; //表明一开始出发的地方就没有加油站
double minprice=INF;
int minid=-;
for(int j=i+;j<=n;j++){
if(now+driveDis>=gas[j].dis){
//若找到第一个比当前车站价格小的车站,就不继续往下找了
if(gas[j].price<gas[i].price){
minid=j;
minprice=gas[j].price;
break;
}
//否则,就一直找出其中费用最小的
if(gas[j].price<minprice){
minprice=gas[j].dis;
minid=j;
}
}
}
if(minid==-){
now=gas[i].dis+maxdrive;
break;
}
else{
if(minprice<gas[i].price){
//如果有费用比当前车站i更小的车站,那么加油量只需让车能够达到车站即可
sum+=((gas[minid].dis-gas[i].dis)*1.0/davg-leftdrive*1.0/davg)*gas[i].price;
leftdrive=;
i=minid-;
}
else{
//如果没有费用更小的,那么在i处把油加满,达到后面费用最小的那个车站
sum+=(capacity-leftdrive*1.0/davg)*gas[i].price;
leftdrive=maxdrive-(gas[minid].dis-gas[i].dis);
i=minid-;
}
now=gas[minid].dis;
}
}
if(now==dis){
printf("%.2lf\n",sum);
}
else{
printf("The maximum travel distance = %.2lf\n",(double)now);
}
return ;
}

PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟的更多相关文章

  1. PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789220.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. PAT甲题题解-1068. Find More Coins (30)-dp,01背包

    一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...

  3. PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...

  4. PAT甲题题解-1010. Radix (25)-二分搜索

    题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...

  5. PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

    题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...

  6. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  7. PAT甲题题解-1019. General Palindromic Number (20)-又是水题一枚

    n转化为b进制的格式,问你该格式是否为回文数字(即正着写和倒着写一样)输出Yes或者No并且输出该格式又是水题... #include <iostream> #include <cs ...

  8. PAT甲题题解-1023. Have Fun with Numbers (20)-大数加法

    和1024一样都是大数据的题,因为位数最多要20位,long long最多19位给一个num,求sum=num+num问sum包含的数字,是否是num的一个排列,即数字都一样,只是顺序不同罢了. #i ...

  9. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

随机推荐

  1. mitmproxy

    通过脚本定制化实现篡改request或者response mitmproxy 顾名思义中间人代理[man-in-the-middle proxy],和fiddler.Charles等工具类似,通过代理 ...

  2. 题解 P2701 【[USACO5.3]巨大的牛棚Big Barn】

    题面 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚. 他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方. 我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的 ...

  3. 【Alpha 冲刺】 7/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 建立数据库 已完成 孙浩楷 完成作业列表界面 已完成 胡冰 完成作业展示页面 已完成 练斐弘 完成课件列表页面 未完成 时间不够 ...

  4. [python] os.path模块常用方法汇总

    os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...

  5. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  6. java中Integer与int装箱拆箱一点收获

    示例代码: class BoxIntInteger { public static void main(String[] args) { Integer a = new Integer(10111); ...

  7. 【转】Android中通知的提示音、震动和LED灯效果小例子

    通知(Notification)是 Android 系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现.发出一条通知后,手机最上方 ...

  8. Scala学习之路 (四)Scala的数组、映射、元组、集合

    一.数组 1.定长数组和变长数组 import scala.collection.mutable.ArrayBuffer object TestScala { def main(args: Array ...

  9. shiro实战系列(十一)之Caching

    Shiro 开发团队明白在许多应用程序中性能是至关重要的.Caching 是从第一天开始第一个建立在 Shiro 中的一流功 能,以确保安全操作保持尽可能的快.   然而,Caching 作为一个概念 ...

  10. Python2.7-difflib

    difflib主要用于比较两个序列的不同,常见于字符串的比较,可以对差异生成报告.SequenceMatcher 主要用于找两者相似部分,以及两者不同的转换方法,而 Differ 更注重于比较两者的区 ...