蓝桥杯:旅行家的预算 贪心解法
蓝桥杯:旅行家的预算 贪心解法
问题描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离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
思路
这题贪心的点就是:(应该不用证明了把)
使用尽量便宜的油,走尽量远的路程
贪心思路:
反复贪心
每到达一个油站,找出最便宜的油站(已经经过了的油站不考虑,不走回头路),然后开始贪
if (最便宜的油站是当前站)
{if (剩余油量能够到达终点):{直接开到终点就好}else if (剩余油量不够到达终点,但是加油之后可以到){加刚刚好到终点的油就好}else // 这种情况说明油箱加满也到不了终点{直接把油箱加满(我们希望总是使用最便宜的油走最多的路程)开到下一个油站}
}
else // 这种情况是最便宜的油站在当前油站之后
{if (剩余油量可以到达最便宜的油站){直接开到最便宜的油站}else // 这种情况说明剩余油量到不了最便宜的油站{加刚刚好能够到达最便宜油站的量的油}
}
代码
#include <iostream>
#include <algorithm>
#include <cstdio>using namespace std;double d1, c, p0, d2;
int n;
#define MAXLEN 114514
#define inf 1145141919
double di[MAXLEN];
double pi[MAXLEN];int main()
{cin>>d1>>c>>d2>>p0>>n;double max_dis = c * d2;di[0] = 0;pi[0] = p0;for(int i=1; i<=n; i++){cin>>di[i]>>pi[i];}// 先判断能不能到达终点 double max = 0; // 最大可达距离 double p = 0; // 当前位置 for(int i=1; i<=n; i++){if(di[i]-p <= max_dis){p = di[i];} }if(p+max_dis < d1){cout<<"No Solution"<<endl;return 0;}// 开始反复贪心 double loc = 0; // 当前位置 double oil = 0; // 当前剩余油量 double price = 0; // 消费 int lid = 0; // 当前所在油站的下标 while(loc < d1){// 找出最便宜的,没有经过的油站 double min = inf;int idx = 0;for(int i=0; i<=n; i++){if(pi[i] < min && di[i]>=loc){min = pi[i];idx = i;}}// 如果最便宜的在当前油站 if(di[idx] == loc){// 如果已经够油到终点 if(loc+oil*d2 >= d1){// 直接开到终点 loc = d1; }// 如果不够油到终点,但是满油能够到达else if(loc+max_dis >= d1){// 加到刚好能够到终点 price += ((d1 - loc)/d2 - oil) * pi[idx];loc = d1;}// 如果满油也到不了,直接加满 else{price += (c - oil) * pi[idx];oil = c;// 去到下一个油站 oil -= (di[idx+1] - loc)/d2;loc = di[idx+1];lid = idx + 1;}}// 如果最便宜的油站在当前油站之后 else{// 如果当前油能够到最便宜油站if(di[idx] <= oil*d2+loc){// 开往最便宜的油站 oil -= (di[idx] - loc)/d2;loc = di[idx];lid = idx;}// 如果不能到达,在当前的油站加到刚好能够到 else {price += (di[idx]-loc)/d2 * pi[lid];// 开往最便宜的油站 oil = 0;loc = di[idx];lid = idx;}}}printf("%.2lf\n", price);return 0;
}
蓝桥杯:旅行家的预算 贪心解法相关推荐
- java 旅行家的预算_洛谷 P1016 旅行家的预算 Java解法
洛谷 P1016 旅行家的预算 Java解法 洛谷 P1016 旅行家的预算 Java解法 package com.two; import java.util.Scanner; public clas ...
- 旅行家的预算[贪心]
题目 Problem description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶 ...
- 洛谷P1016 旅行家的预算 贪心
这道题就是贪心 1.在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站 2.这些车站中所有都比自己大,那就找一个 ...
- vijos:旅行家的预算[贪心]
题目 Problem description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶 ...
- [蓝桥杯] 三升序列 python解法
[问题描述] 对于一个字母矩阵,我们称矩阵中的一个三升序列是指在矩阵中找到三个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这三个字母从左向右看.或者从上向下看是递增的. 例如,如下矩阵中 ...
- 超级简单易懂的蓝桥杯《成绩统计》解法
看了就会的解法: 适合刚入门编程语言的伙伴参考, 本人也是刚刚入门, 刚入门的伙伴可以一起讨论: #include <iostream> #include<math.h> us ...
- 洛谷 1016 [NOIP1999] 旅行家的预算 贪心
题目: https://www.luogu.org/problemnew/show/1016 这道题好麻烦啊~~~~ 贪心策略: 尽可能少花钱(废话),能省就省; 这才是贪心嘛 当前点为i: 将之前的 ...
- 【蓝桥杯方法篇】贪心算法详解一
文章目录 一,贪心算法 二,以分配题为例 2.1,饼干分配 2.2,最少硬币问题 三,区间问题
- 蓝桥杯Python 自行车停放极简解法
题目描述 有 nn 辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边.(e.g.停车棚里已经有 33 辆自行车,从左到右编号为:3,5,13, ...
最新文章
- zabbix 3.4 ubuntu 16 用腾讯企业邮箱作为告警邮箱
- Office365 Manager Plus之报表
- aspectj annotation- used in spring
- 它来了,阿里架构师的“Java多线程+并发编程”知识点详解手册,限时分享
- openpyxl删除添加excel列_Python | 如何使用Python操作Excel(二)
- TOMCAT启动完成但是ECLIPSE仍然显示starting....
- java实现程序输出以下5*5数字方格
- 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划
- 想和人脑一样智能? IBM 的芯片级模仿才是关键
- 软件项目开发成本经常用到的估算方法
- 视频教程-iOS企业级Swift项目实战之我的云音乐(第一部分)-iOS
- 计算机教程无线路由器桥接上网,2个无线路由器桥接教程详细步骤
- 微信公众号文章采集工具,可采集文章文字内容信息及图片
- Stream流基本使用
- JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)
- 摩托罗拉九宫格锁屏怎么解锁
- 我也就是尝试了一下斗图的快乐
- 5G图传 5G单兵 5G视频终端 无人机4G图传
- 吴恩达 - 第五周 - 笔记
- 李宏毅language课程Speach Recongition