题目1437:To Fill or Not to Fill

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:1488

解决:345

题目描述:

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.

输入:

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.

输出:

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.

样例输入:
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
50 1300 12 2
7.10 0
7.00 600
样例输出:
749.17
The maximum travel distance = 1200.00
来源:
2012年浙江大学计算机及软件工程研究生机试真题
分析:
 //贪心算法
//dis=满油箱可以开出的最远距离。
//算法描述:起点A开始,到A+dis范围内:
//1.如果存在点B的s[B].price<=s[A].price,只要满足能行驶到B点即可
//2.如果不存在点B的s[B].price<=s[A].price,则要使车能开到 A+dis范围内除A以外,price最小的点--min_index所指点
//注意:
//1.终点如果在 A+dis范围内,一定可达
//2.注意排序后第一个点的dis可能不为0
//3.离A点最近的B点与A的距离如果>dis,则此趟行驶到不了终点
//4.油箱的情况每次都要关注
//具体见代码:
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct station{
double price,dis;
};
station s[];
bool cmp(station a,station b){
return a.dis<b.dis;
}
int main(){
double cmax,d,davg;
int n;
while(scanf("%lf%lf%lf%d",&cmax,&d,&davg,&n)!=EOF){
double min_price=;
double max_dis=;
double cur_tank=;
int i=;
for(;i<n;i++){
cin>>s[i].price>>s[i].dis;
}
s[i].dis=d;
s[i].price=;
sort(s,s+n,cmp);
/*for(i=0;i<=n;i++){
cout<<s[i].dis<<' '<<s[i].price<<endl;
}*/
if(s[].dis>){//2.注意排序后第一个点的dis可能不为0
//cout<<1<<endl;
printf("The maximum travel distance = 0.00\n");
continue;
}
int f=;
double dis=cmax*davg;
int min_index;
while(s[f].dis<d){
int next=f+;
min_index=next;
while((s[next].dis-s[f].dis)<=dis){//如果next==n,一定会从break处出去
//跳出循环只有三种情况:
//1.在dis范围内,没有点与f点的距离小于等于dis
//2.在dis范围内,找到price小于f的点(包括next==n)
//3.next!=n,但在dis范围内,没有找到price小于f的点。在dis范围内,有点与f点的距离小于等于dis
if(s[next].price<s[min_index].price){//记录最小的油价的站点
min_index=next;
}
if(s[next].price<=s[f].price){//在dis范围内,找到price小于f的点
break;
}
next++;
}
if(next==f+&&(s[next].dis-s[f].dis)>dis){//1.在dis范围内,没有点与f点的距离小于等于dis
//cout<<1<<endl;
max_dis+=dis;
break;
}
else{
if((s[next].dis-s[f].dis)<=dis){//2.在dis范围内,找到price小于f的点(包括next==n)
if(s[next].dis-s[f].dis>cur_tank){
min_price+=(s[next].dis-s[f].dis-cur_tank)*s[f].price;
cur_tank=;
max_dis+=s[next].dis-s[f].dis;
}
else{
cur_tank-=s[next].dis-s[f].dis;
max_dis+=s[next].dis-s[f].dis;
}
f=next;
}
else{//3.next!=n,但在dis范围内,没有找到price小于f的点。在dis范围内,有点与f点的距离小于等于dis
min_price+=(dis-cur_tank)*s[f].price;
cur_tank=dis-(s[min_index].dis-s[f].dis);
max_dis+=s[min_index].dis-s[f].dis;
f=min_index;
}
}
}
if(s[f].dis==d){
printf("%.2lf\n",min_price/davg);
}
else{
printf("The maximum travel distance = %.2lf\n",max_dis*1.0);//注意输出格式
}
}
return ;
}
 

九度oj 1437 To Fill or Not to Fill 2012年浙江大学计算机及软件工程研究生机试真题的更多相关文章

  1. 九度oj 1468 Sharing 2012年浙江大学计算机及软件工程研究生机试真题

    题目1468:Sharing 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2687 解决:550 题目描述: To store English words, one method is ...

  2. 九度oj 1464 Hello World for U 2012年浙江大学计算机及软件工程研究生机试真题

    题目1464:Hello World for U 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3872 解决:1082 题目描述: Given any string of N (> ...

  3. 九度OJ 1019 简单计算器 -- 2006年浙江大学计算机及软件工程研究生机试真题

    题目地址:http://ac.jobdu.com/problem.php?pid=1019 题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: ...

  4. 九度oj 1034 寻找大富翁 2009年浙江大学计算机及软件工程研究生机试真题

    题目1034:寻找大富翁 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5323 解决:2123 题目描述:     浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入:     ...

  5. 九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题

    题目1031:xxx定律 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5153 解决:3298 题目描述:     对于一个数n,如果是偶数,就把n砍掉一半:如果是奇数,把n变成 3*n ...

  6. 九度oj 1032 ZOJ 2009年浙江大学计算机及软件工程研究生机试真题

    题目1032:ZOJ 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4102 解决:2277 题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当 ...

  7. 九度oj 1006 ZOJ问题 2010年浙江大学计算机及软件工程研究生机试真题

    题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:16244 解决:2742 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC.是 ...

  8. 九度oj 1004 Median 2011年浙江大学计算机及软件工程研究生机试真题

    题目1004:Median 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:14162 解决:3887 题目描述: Given an increasing sequence S of N i ...

  9. 九度oj 1003 A+B 2010年浙江大学计算机及软件工程研究生机试真题

    题目1003:A+B 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:12812 解决:5345 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号",&qu ...

随机推荐

  1. Android-ContentProvider读取/新增/操作系统联系人数据

    想要访问Android操作系统的ContentProvider就需要明白以下原理: 在Android操作系统里面的 /packsges/目录: apps: 很多的系统应用,例如:联系人,浏览器,音乐播 ...

  2. .net core i上 K8S(二)运行简单.netcore程序

    上一章我们搭建了k8s集群,这一章我们开始在k8s集群上运行.netcore程序 1.kubectl run 在我的Docker系列教程里,我曾往docker hub中推送过一个镜像“webdokce ...

  3. 【海量干货】89页PPT详解微信O2O行业解决方案

    根据腾讯大讲堂提供的信息,整理成了PPT,下载地址: http://yunpan.cn/cZAbTnJXnMymd  访问密码 f36d

  4. Spring Boot - Spring Scheduling

    有时应用需要定时(如凌晨)执行一些任务(比如计算一些数据并存下来留给后续使用) 使用 使用@EnableScheduling注解启用Scheduling功能:不一定要标注在启动类上,也可以标注在@Co ...

  5. CF666E Forensic Examination(后缀自动机+动态线段树)

    题意 给你一个串 $S$ 以及一个字符串数组 $T[1..m]$ , $q$ 次询问,每次问 $S$ 的子串 $S[p_l..p_r]$ 在 $T[l..r]$ 中的哪个串里的出现次数最多,并输出出现 ...

  6. [BZOJ]4650 优秀的拆分(Noi2016)(哈希+二分)

    传送门   题解 听说大佬们这题都是用SA秒掉的 然而SA的时间复杂度的确很优秀,缺点就是看不太懂…… 然后发现一位大佬用哈希华丽的过了此题,而且讲的特别清楚->这里 我们只要考虑以每一个点结尾 ...

  7. hdu3698 Let the light guide us(dp+线段树)

    题意:在每行上选一个点,每个点都要各自对应的代价,同时相邻两行的点要满足 |j-k|≤f(i,j)+f(i+1,k).问最小代价是多少. 题解: 不难发现这是一道dp,状态转移方程如下$dp[i][j ...

  8. mysqli扩展库---事务控制

    1, 有一张银行账号表 create table account( id int primary key, balance float ); 2,现在有一段php程序,要完成把1号10元钱,转到2号账 ...

  9. mysql基础操作学习笔记(一)

    1前期准备: SQL语言包涵以下4个部分: (1)数据定义语言(DDL):包括DROP, CREATE, ALTER等语句 (2)数据操纵语言(DML):包括INSERT, UPDATE, DELET ...

  10. openstack 使用pbr配置,setup.cfg的格式与含义

    pbr - Python Build Reasonableness A library for managing setuptools packaging needs in a consistent ...