算法训练 旅行家的预算  
时间限制:1.0s   内存限制:256.0MB
问题描述
  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
  第一行为4个实数D1、C、D2、P与一个非负整数N;
  接下来N行,每行两个实数Di、Pi。
输出格式
  如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。
样例输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
样例输出
26.95
 
 题目解析:

  将起点想象成第 0 个加油站,终点想象成 N+1 个加油站
    第 0 个加油站距离起点的距离为 0,第 N+1 加油站距离起点的距离为 D1
    第 0 个加油站的价格为 P,第 N+1 加油站的价格为 0
    根据油箱容量 C 和每升汽油能能行驶的距离 D2 可以计算出油箱加满油可以行驶的最大距离 maxDis

  无解:(在输入时就判断,尽快找出无解情况)
    如果两个加油站的距离大于加满油可以行驶的最大距离,那么无解

  有解:
    从当前位置的下一个加油站寻找距离最近且便宜的加油站:
      1. 如果能找到了
        (1)如果能一次加油到达,那么加到刚好能到达便宜的加油站即可
        (2)如果一次不能到达,那么先将油箱加满,到达行驶最大距离之前的那个加油站,再加到刚好行驶到的便宜那个加油站
      2. 如果没找到,则加满油,行驶到最大距离之前的那个加油站,继续寻找
    注意:终点的加油站价格为 0,所以最后一次加油加到刚好到达终点即可

 
示例代码:

 #include<iostream>
#include<cstdio>
using namespace std; #define MAX_NUM 1001 int main()
{
int N;
double D1, C, D2, P;
scanf("%lf%lf%lf%lf%d", &D1, &C, &D2, &P, &N); // double * distance = new double[N+5]; //加油站i到起点的距离
// double * price = new double[N+5]; //油的价格
double distance[MAX_NUM];
double price[MAX_NUM]; distance[] = ; //记录第i个点离出发点的距离
price[] = P; //起点的油价
distance[N+] = D1; //终点为最后一个加油站
price[N+] = ; //终点价格 double total = ; //费用
double surplus=; //到第i个加油站的时候的剩余油量
double maxDis = C * D2; //加满油行使的最大距离
bool flag = true; //是否有解,默认有解 for (int i = ;i <= N; i++)
{
scanf("%lf%lf", &distance[i], &price[i]);
if (distance[i] - distance[i-] > maxDis) //如果两个加油站的距离大于加满油可以行使的距离 ,则无解
{
flag = false; //无解
}
} if(!flag) //无解
{
printf("No Solution\n");
return ;
} /*
i:当前加油站的编号
j:下一个比自己便宜的加油站的编号
*/
for (int i = , j; i <= N; i = j) //到达j之后,将j赋值给i,重新循环,知道到达终点
{
for (j = i + ; j <= N + ; j++) //从i的下一个开始找比它便宜的加油站
{
if (distance[j] - distance[i] > maxDis) //如果不能行使到比它便宜的加油站
{
j--; //则先行驶到便加满油后能驶得最大距离之前的加油站
break;
}
if (price[j] <= price[i]) //找比现在所在的加油站便宜的加油站
{
break;
}
} /*
从当前位置的下一个加油站寻找距离最近且便宜的加油站:
1 如果能找到了
(1)如果能一次加油到达,那么加到刚好能到达便宜的加油站即可
(2)如果一次不能到达,那么先将油箱加满,到达行驶最大距离之前的那个加油站,再加到刚好行驶到的便宜那个加油站
2 如果没找到,则加满油,行驶到最大距离之前的那个加油站,继续寻找
*/ if (price[j] <= price[i]) //属于(1)
{
total += ((distance[j] - distance[i]) / D2 - surplus) * price[i]; //加到可以刚好行使到 j 点
surplus = ; //剩余油量
}
else //属于(2)或 2
{
total += (C - surplus) * price[i]; //油箱加满
surplus = C - (distance[j] - distance[i]) / D2; //到j点时剩余油量
}
} printf("%.2lf\n", total); return ;
}

蓝桥杯 算法训练 ALGO-15 旅行家的预算的更多相关文章

  1. Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  2. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  3. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  4. 蓝桥杯 算法训练 ALGO-116 最大的算式

    算法训练 最大的算式   时间限制:1.0s   内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量 ...

  5. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  6. 蓝桥杯 算法训练 ALGO-34 纪念品分组

    算法训练 纪念品分组   时间限制:1.0s   内存限制:256.0MB 问题描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值 相对均衡,他要把购 ...

  7. Java实现 蓝桥杯 算法训练 画图(暴力)

    试题 算法训练 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩 ...

  8. Java实现 蓝桥杯 算法训练 Lift and Throw

    试题 算法训练 Lift and Throw 问题描述 给定一条标有整点(1, 2, 3, -)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这 ...

  9. Java实现 蓝桥杯 算法训练 Airport Configuration

    试题 算法训练 Airport Configuration 问题描述 ACM机场是一个本地机场,对于大多数人来说,机场不是他们的终点或起点,而是中转站.机场有一个规划图.到达的大门在机场的北边(相当于 ...

随机推荐

  1. eclipse设置控制台字体大小

    步骤如下

  2. codevs 1017 乘积最大 dp

    1017 乘积最大 时间限制: 1 s 空间限制: 128000 KB         题目描述 Description 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚 ...

  3. 技术分享:HBase架构

    Zookeeper,作为分布式的协调.RegionServer也会把自己的信息写到ZooKeeper中. HDFS是Hbase运行的底层文件系统 RegionServer,理解为数据节点,存储数据的. ...

  4. Google推荐——Glide使用详解(图片加载框架)

    零.前言 本文所使用的Glide版本为3.7.0 一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的goo ...

  5. 关于Action和EventHandler

    .net框架自带的两个常用类(Action和EventHandler),当然这两个类型的也可以自定义,但系统已经提供,直接拿来用即可,很方便 1:Action : 引用“void方法”的委托,目前框架 ...

  6. JSON/JSONP浅谈

    一.什么是JSON? JSON 即 JavaScript Object Notation 的缩写,简而言之就是JS对象的表示方法,是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法,类 ...

  7. Ajax-08 跨域获取最新电视节目清单实例

    目标一 请求江西网络广播电视台电视节目 URL:http://www.jxntv.cn/data/jmd-jxtv2.html 分析 1.从Http头信息分析得知,器服务端未返回响应头Access-C ...

  8. C++空类和string类

    1. 空类 1.1 空类默认哪六个成员函数. class Empty { public: Empty(); //缺省构造函数 Empty e; Empty( const Empty& ); / ...

  9. sizeof结构体

    规则1:结构体的对折长度为其基本数据成员的长度的最大值. 规则2:指定边界情况下,结构体的对折长度为自身对折长度和指定对折长度中较小者. 规则3:当行内结构体的基本数据成员的起始地址必须为其长度的整数 ...

  10. 【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-J】 强迫症的序列

    小A是一个中度强迫症患者,每次做数组有关的题目都异常难受,他十分希望数组的每一个元素都一样大,这样子看起来才是最棒的,所以他决定通过一些操作把这个变成一个看起来不难受的数组,但他又想不要和之前的那个数 ...