算法训练 旅行家的预算  
时间限制: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向上/下复制一行(或者多行)的快捷键失效的基本解决方法

    在eclipse中,快捷键Ctrl+Alt+↓是向下复制选中的行,快捷键Ctrl+Alt+↑是向上复制选中的行. 这两个快捷键也是我常用的快捷键之一,以前也遇到失效. 所以现在记录一个解决的方法: 在 ...

  2. Binder机制-简单用法(一)

    Binder算是android里面比较难懂的部分了,但是非常重要,基本上,当我们深入到进程交互的阶段,Binder都是一个绕不开的槛,所以我也希望帮助大家更浅显地了解到这个知识点.笔者想通过3篇博文简 ...

  3. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    转自:https://blog.csdn.net/linxingliang/article/details/52263763 spring boot 自学笔记(三) Redis集成—RedisTemp ...

  4. js 技巧总结

    插件解析 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使 ...

  5. python运行httpserver

    $ python -m SimpleHTTPServer $ python3 -m http.server

  6. vue2项目中better-scroll 插件使用时候页面不滚动

    参考这里 1.外面包裹层的高度没有设置或者条目的高度没有超过外面包裹层的高度 2.初始化BetterScroll的时机不对,当前元素还没有正常渲染出来,导致BetterScroll的高度的计算错误

  7. js 设置日期函数

    前三十天: var now = new Date(); var prev = now.setDate( now.getDate() - 30 ) vm.sDate = comm.getFormatDa ...

  8. Django和pymysql搭建学员管理系统

    学员管理系统 项目规划阶段 项目背景 近年来老男孩教育的入学学员数量稳步快速增长,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求.因此公司急需一套方便易用的“学员管理系统”,来提 ...

  9. Android中自动跳转

    先看效果图吧    -------->        -------->   Activity类 package com.xm; import java.io.File; import j ...

  10. MS SQL Server2000转换成MySQL

    按计划今天着手进行将后台数据库从MS SQL Server2000转换成MySQL5.1.3.目的是便于发布软件的测试版本. 1. 驱动: mysql-connector-odbc-5.1.11-wi ...