蓝桥杯 算法训练 ALGO-15 旅行家的预算

算法训练 旅行家的预算

时间限制: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,所以最后一次加油加到刚好到达终点即可

示例代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4
 5 #define MAX_NUM  1001
 6
 7 int main()
 8 {
 9     int N;
10     double D1, C, D2, P;
11     scanf("%lf%lf%lf%lf%d", &D1, &C, &D2, &P, &N);
12
13 //    double * distance = new double[N+5];    //加油站i到起点的距离
14 //    double * price = new double[N+5];          //油的价格
15     double  distance[MAX_NUM];
16     double  price[MAX_NUM];
17
18     distance[0] = 0;            //记录第i个点离出发点的距离
19     price[0] = P;                //起点的油价
20     distance[N+1] = D1;            //终点为最后一个加油站
21     price[N+1] = 0;                //终点价格
22
23     double total = 0;            //费用
24     double surplus=0;            //到第i个加油站的时候的剩余油量
25     double maxDis = C * D2;        //加满油行使的最大距离
26     bool flag = true;            //是否有解,默认有解
27
28     for (int i = 1;i <= N; i++)
29     {
30         scanf("%lf%lf", &distance[i], &price[i]);
31         if (distance[i] - distance[i-1] > maxDis)    //如果两个加油站的距离大于加满油可以行使的距离 ,则无解
32         {
33             flag = false;    //无解
34         }
35     }
36
37     if(!flag)    //无解
38     {
39         printf("No Solution\n");
40         return 0;
41     }
42
43     /*
44         i:当前加油站的编号
45         j:下一个比自己便宜的加油站的编号
46     */
47     for (int i = 0, j; i <= N; i = j)    //到达j之后,将j赋值给i,重新循环,知道到达终点
48     {
49         for (j = i + 1; j <= N + 1; j++)    //从i的下一个开始找比它便宜的加油站
50         {
51             if (distance[j] - distance[i] > maxDis)    //如果不能行使到比它便宜的加油站
52             {
53                 j--;                        //则先行驶到便加满油后能驶得最大距离之前的加油站
54                 break;
55             }
56             if (price[j] <= price[i])        //找比现在所在的加油站便宜的加油站
57             {
58                 break;
59             }
60         }
61
62         /*
63             从当前位置的下一个加油站寻找距离最近且便宜的加油站:
64             1 如果能找到了
65                 (1)如果能一次加油到达,那么加到刚好能到达便宜的加油站即可
66                  (2)如果一次不能到达,那么先将油箱加满,到达行驶最大距离之前的那个加油站,再加到刚好行驶到的便宜那个加油站
67             2 如果没找到,则加满油,行驶到最大距离之前的那个加油站,继续寻找
68         */
69
70         if (price[j] <= price[i])    //属于(1)
71         {
72             total += ((distance[j] - distance[i]) / D2 - surplus) * price[i];    //加到可以刚好行使到 j 点
73             surplus = 0;                                    //剩余油量
74         }
75         else    //属于(2)或 2
76         {
77             total += (C - surplus) * price[i];                //油箱加满
78             surplus = C - (distance[j] - distance[i]) / D2;    //到j点时剩余油量
79         }
80     }
81
82     printf("%.2lf\n", total);
83
84     return 0;
85 }
时间: 2024-10-24 16:07:52

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

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

蓝桥杯 算法训练 ALGO-139 s01串

算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为"0"  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定  0~19 示例代码: 1 import java.util.Scanner; 2 3 public class Main { 4 static StringBuffer sb = new StringBuffer(); 5 public

蓝桥杯 算法训练 ALGO-57 删除多余括号

算法训练 删除多余括号 时间限制:1.0s   内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简.另外不考虑'+' '-'用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形. 输入格式 表达式字符串,长度不超过255, 并且不含空格字符.表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号. 输出格式 去掉多余括号后的表达式

蓝桥杯 算法训练 ALGO-117 友好数

算法训练 友好数 时间限制:1.0s   内存限制:256.0MB 问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 4的约数和有:1+2=3 所以9和4不是友好的. 220的约数和有:1 2 4 5 10 11 20 22 44 55 110=284 284的约数和有:1 2 4 71 142=220 所以220和284是友好的. 编写程序,判断两个数是否是友好数. 输入格式 一行,两个整数,由空格分隔 输出格式 如

蓝桥杯 算法训练 ALGO-122 未名湖边的烦恼

算法训练 未名湖边的烦恼 时间限制:1.0s   内存限制:256.0MB 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面.(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法) 输入格式 两个整数,表示m和n 输出格式 一个整数,表示队伍的排法的方案数. 样例输

蓝桥杯 算法训练 ALGO-126 水仙花

算法训练 水仙花 时间限制:1.0s   内存限制:256.0MB 水仙花数 问题描述 判断给定的三位数是否 水仙花 数.所谓 水仙花 数是指其值等于它本身 每位数字立方和的数.例 153 就是一个 水仙花 数. 153=13+53+33 输入格式 一个整数. 输出格式 是水仙花数,输出"YES",否则输出"NO"(不包括引号) 样例输入 123 样例输出 NO 数据规模和约定 一个三位的整数,否则输出"NO" 示例代码: 1 import ja

蓝桥杯 算法训练 ALGO-156 表达式计算

算法训练 表达式计算 时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. 题目解析: 运算优先级: 括号 → 乘除 → 加减 例如 1-2+3*(4-5) (1)计算(4-5),表达式变为  1-2+3*-1 (2