To Fill or Not to Fill 九度教程第25题 较为复杂的贪心策略

【博文汇总】I2C总线学习 将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序 阅读详情

题目链接

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.
示例1
输入
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

题目大意:汽车从杭州出发前往目的地,但是油箱的容量是有限的,路上有很多加油站,每个加油站的价格不同。为汽车设计一个从杭州到终点的最便宜的加油策略,Cmax表示油箱最大容量,D表示杭州到目的地的距离,Davg表示平均每单位的汽油可以让汽车行驶的距离,N表示汽车的站点数量,每个站点都会给出它的单位油价Pi和汽车站点和杭州的距离Di,求汽车从杭州到终点的最小花费,如果不能够到达,就输出汽车能够行驶的最大距离。

解题思路:
贪心策略
准备工作:

1. 为了方便考虑边界,将终点也视为一个加油站且价格无限低,因此我们总是空箱到达终点,这样的话就不会有油量剩余;
2. (这一步不做也可以,只是博主的习惯^_^)将题目中给出的加油站到起点的距离转化为各个加油站到终点的距离,然后按照距离从大到小排序。

因为将终点也视为了一个加油站,则共有n+1个站点
对于当前站点tmp,所能到达的最大范围即满油量所能到达的距离,设满油量能前进的距离为max_len,则在tmp.pos到tmp.pos-max_len范围内,分如下情况进行考虑:

1、此范围内有加油站
①若能够到达一家更便宜的加油站,则立即空箱到达。这样的话就能使用更加便宜的油了,这里找到的便宜加油站是离得最近的便宜加油站,而不一定是最便宜的加油站。
②如果能够到达的汽油站都更贵,则满箱出发,在能够到达的最便宜的汽油站加油。这样的话我们就能尽量使用便宜的价格了。

2、此范围内无加油站
因为终点也算加油站,这种情况下肯定是到达不了终点,只需要把油加满,能跑多远跑多远。

这里来看一下对样例1的模拟过程:

7.1   7.0   7.2   6.85  7.5  7.0  7.3   6.0  0.0
1300  1150  1100  1000  900  700  300   50   0
满箱能够前进的最大距离为600
在起始位置1处,能够到达更加便宜的站点2(价格为7.0),则适量补充油量后,空箱到达
在站点2出,能够到达更加便宜的站点4(价格为6.85),则适量补充油量后,空箱到达
在站点4处,能够到达的站点价格都更贵,则加满油后,到达最便宜的站点6
在站点6处,能够到达的站点价格都更贵,则加满油后,到达最便宜的站点7
在站点7处,能够到达更加便宜的站点8(价格为6.0),则适量补充油量后,空箱到达
在站点8处,能够到达更加便宜的站点9(价格为0.0),则适量补充油量后,空箱到达

AC代码:

/*贪心策略:
站在一家加油站上开始考虑
若能够到达一家更便宜的加油站 则立即空箱到达;
如果能够到达的汽油站都更贵,则满箱出发,在能够到达的最便宜的汽油站加油
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define maxn 510
#define INF 0x3f3f3f3f
struct node {
	double price;
	int pos;
}list[maxn];
bool cmp(node a, node b) {
	return a.pos > b.pos;
}
int main() {
	double c;
	int l, num, n;
	while (cin >> c >> l >> num >> n) {
		int max_len = c*num;
		for (int i = 1; i <= n; i++) {
			cin >> list[i].price >> list[i].pos;
			list[i].pos = l - list[i].pos;
		}
		list[n + 1].price = 0; list[n + 1].pos = 0;//将终点也当作一个加油站 价格最低 因此是空箱到达
		sort(list + 1, list + 1 + n+1, cmp);
		//特殊判断起始位置有没有加油站
		//测试用例中貌似没有这样的情况,没有这段单独判断的代码也可以
		if (n == 0 || list[1].pos != l) {
			printf("The maximum travel distance = 0.00\n");
			continue;
		}
		int tmp = 1; double ans = 0.0;//tmp是目前所处的加油站 ans是总的费用
		double tmp_c = 0;//到达加油站时的余量
		while (tmp <= n) {//在加油站上开始考虑
			int now = tmp + 1;//考虑后面的加油站
			double min_price = INF;//目前最低的价格
			int min_n = now;//最低价格的汽油站编号
			bool flag = false;//用于判断是否是空箱到达
			if (list[tmp].pos - list[now].pos > max_len) {//如果不能到达之后的加油站
				ans = l - list[tmp].pos + max_len;//这里ans用做距离
				printf("The maximum travel distance = ");
				break;
			}
			while (now<=n+1&&list[tmp].pos - list[now].pos <= max_len) {//注意now有范围限制
				if (list[now].price < list[tmp].price) {//空箱达到的情况
					int juli = list[tmp].pos - list[now].pos;//计算距离
					double cost = (juli*1.0 / num - tmp_c) * list[tmp].price;//计算代价
					ans += cost;
					tmp = now;
					tmp_c = 0;//空箱到达
					flag = true;
					break;
				}
				else {//满箱出发
					if (list[now].price < min_price) {//记录最低价格以及相应的位置
						min_price = list[now].price;
						min_n = now;
					}
					now++;
				}
			}
			if (flag)continue;//空箱到达
			ans += (c-tmp_c)*list[tmp].price;//满箱出发 即在当前的加油站将邮箱加满
			int juli = list[tmp].pos - list[min_n].pos;
			tmp_c = c - juli*1.0 / num;//剩余油量
			tmp = min_n;//当前位置
		}
		printf("%.2f\n", ans);
	}
	return 0;
}
Cesium教程(十七):淹没分析 淹没分析是根据某片区域的地形及洪水流量速度,动态模拟该地形区域水位逐渐上涨的淹没过程。该功能可适用于山区、丘陵等地形起伏较大区域,模拟洪水涨到安全限定高度的淹没过程,为防洪水救灾提供一定的参考。此外,还可以为河谷地带修建水利工程设计与选址提供参考依据。 阅读详情

相关推荐

Unity插件UniWebView实战:UGUI动态调整内嵌网页尺寸与交互优化

本文详细解析了如何在Unity游戏中使用UniWebView插件实现内嵌网页的动态尺寸适配与深度交互。核心在于利用Reference Rect Transform属性,将网页窗口精准绑定至UGUI控件,并随其动态调整。文章进一步探讨了通过消息系统与JavaScript执行实现Unity与网页的双向通信,并提供了加载优化、过渡动画及事件拦截等实用技巧,助力开发者打造无缝、流畅的游戏内网页体验。

earth的博客 276

To Fill or Not to Fill(贪心算法)

有了高速公路,开车从杭州到任何其他城市都很容易。但由于汽车的油箱容量有限,我们必须不时地在路上找到加油站。

qq_42637799的博客 373

AXI4接口说明

ACLK:全局AXI接口时钟输入(建议与系统时钟保持一致)ARESET_n:全局AXI接口复位信号,低电平有效。PS:在HBM AXI接口应用中,此复位端口仅应在数据传输开始前使用。若在传输开始后使用,会导致AXI接口与内存控制器失步(out-of-sync)。当开关启用时,IP核会将所有ARESET_n引脚内部连接在一起——因为内存作为一个整体工作。

rhtul的博客 1522

【PAT(甲级)】1033 To Fill or Not to Fill(详细的解题思路)

【PAT(甲级)】1033 To Fill or Not to Fill(详细的解题思路) 题目给出油箱容量(C),目的地距离(D),平均每升汽油可以行驶的里程数(D_avg),加油站数量(N),然后还有每个加油站距离杭州的距离和油价。要求我们给出到达目的地时,怎么样加油最省钱(一开始的车是没有油的),如果到不了目的地,那么最远能开到哪里。 1. 自定义一个结构来存储加油站信息,将加油站由近到远排序。如果最近的加油站距离杭州不是0,那么直接输出。因为车一开始是没有油的,加油站在出生点没有的话,就没办法开。

weixin_55202895的博客 2113

保姆级教学,教你在vscode和cursor上调试matlab!!!

保姆级教你如何在vscode或者cursor上面调试matlab

yang_upup的博客 2083

告别Modern Standby噩梦:Win11睡眠断网冻结的根源剖析与S3睡眠回归实战

本文深入剖析了Windows 11中Modern Standby(现代待机)模式导致睡眠后断网、系统冻结等问题的根源,指出其与硬件驱动、后台活动的兼容性矛盾。文章提供了通过修改注册表键值强制系统回归稳定S3睡眠状态的详细实战步骤,帮助用户彻底解决睡眠故障,实现可靠的远程访问与挂机任务。

weixin_29210727的博客 606

PAT甲级-贪心类型-1033 To Fill or Not to Fill解题思路

1033 To Fill or Not to Fill (25 分) 思路 该题是找出最便宜路线的价格,不能到达终点就输出最大到达路径即可。 注意细节:起点没有加油站,直接输出最大路径为0 具体做法:把终点设置为一个加油站,花费为0,距离最远。 在可以到达的前提下,寻找比当前更便宜的加油站,算好到达所用花费,若无比当前更便宜,需把油箱加满。 题型类似:这类贪心,寻找花费最少,需要用到sort,再用循环。 代码 #include<bits/stdc++.h> using namespace s

weixin_43999137的博客 490

YOLOv8改进002:添加小目标检测头(小目标检测大量涨点)

YOLOv8 目标检测算法改进之添加小目标检测头,亲测在小目标检测的数据集上有大幅度的涨点效果(mAP直接涨了 0.04 左右)。

m0_46496775的博客 9877

1033 To Fill or Not to Fill(25 分)

思路:关键在于贪心策略的选取 如果把终点也当做一个加油站处理,则代码可以简化很多 贪心策略详细描述,遍历在当前站点所能达到的所有站点,分两种情况讨论: 0.寻找比自己距离远的,到能够到达的最大距离之间的加油站,看他们的油价。如果找到了更低价格的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更低价格的加油站(有更低的我一分都不想多花在别的距离上,只加到刚好满足更低价格的加油站的距离就...

程序人生 1028

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

Coding... 2831

Android系统开机时间分析与优化指南

本文系统阐述了Android开机时间优化的全流程技术方案。首先详细解析了从电源键按下到桌面显示的完整启动流程及关键事件序列,然后介绍了秒表计时、日志分析和自动化脚本三种测量方法。重点从底层和上层两个维度提出了具体优化措施:底层包括编译器优化、内核驱动裁剪和日志精简;上层涵盖系统服务参数调整、应用预优化和功能组件精简。最后提供了验证工具和方法,并强调优化需要在性能、功耗和功能间取得平衡。通过这套系统化方案,可有效提升Android设备的开机速度与用户体验。

学无止境 352

Problem C: To Fill or Not to Fill(思路 + C++代码实现)

Problem C: To Fill or Not to Fill 题目链接:http://codeup.hustoj.com/problem.php?cid=100000584&pid=2 题目大意: 首先,我们通过输入可以获得:油箱的最大容量(Cmax),目的地距离杭州的距离(D),一单位的油可以行驶的距离(Davg),加油站的个数(N)。以及每个加油站对应的油价和距离杭州的距离。 我们要做的就是判断该车能否到达目的地,要是可以到达目的地,就输出达到目的地所需要最少的油费,否则输出该车能行驶的最

weixin_46002777的博客 321

基于Simulink雷达系统建模仿真(附源码)

此示例显示如何设置由发射器、带目标的信道和接收器组成的雷达系统仿真。一、系统架构该系统包括:雷达脉冲发生器,以 2% 占空比(导通时间 = 2 ms,周期 = 100 ms)输出功率为 1 mW 的啁啾声。RF发射器部分由滤波器和组成,使用RF模块集电路包络库模块实现。由于滤波器是线性器件,放大器是非线性器件,因此它们被分成两个独立的子系统。这种分离允许在每个子系统中使用不同的仿真频率集。这种分离还允许在更快的仿真速度和级联链中可用的级间负载效应损失之间进行权衡。

珞瑜的博客 4581

To Fill or Not to Fill

链接

weixin_43878652的博客 227

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

王道机试指南--Fill or not Fill(加油站贪心问题)

题目链接To Fill or Not to Fill 参考博客1033. To Fill or Not to Fill (25) -贪心算法 思路在上面的博客中已经讲的很清楚了,这里我主要讲上述思路代码实现了一下,已经在牛客网上ac掉了。 代码如下: #include &amp;lt;iostream&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cstdio&amp;g..

Accept1234的博客 443

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

1033 To Fill or Not to Fill (25 分) (贪心)

#include<bits/stdc++.h> using namespace std; #define ll long long const int inf=0x3f3f3f; struct station { double price,dis; }sta[600]; int cmp(station a,station b) { return a.dis<b.dis; } int main() { double cmax,davg,d; int n; .

蜡笔小新冲鸭!!! 171

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

PAT A1033 To Fill or Not to Fill 常规思路和实现

题目链接 《算法笔记》上面的思路非常实用,但实现过程不够直观,书上的参考代码如下: #include <cstdio> #include <algorithm> using namespace std; const int maxn=510; const int INF=100000; struct Station{ double price, dis; }st[maxn...

xiaoh1999的博客 313

Codeup小白掉坑经验总结之 To Fill or Not to Fill id=2031

Codeup小白掉坑经验总结之 To Fill or Not to Fill id=2031 题目如下 2031: To Fill or Not to Fill 时间限制: 1 Sec 内存限制: 32 MB 献花: 66 解决: 19 题目描述 With highways available, driving a car from Hangzhou to any other

漫浸天空的雨色的备忘录~ 855

To fill or Not to Fill

2.如果当前加油站费用最低:就加满,计算加油费用和到达后剩余的油。1.每到达一个加油站就寻找下一个最优的加油站k,并计算转移到它的费用。(2)不够,加正好到达k的油,计算加油费用,到达k,油为0,(1)油够,转移费用为0,计算到达后剩余的油。实现每一次转移均花费最少,并累加到这个最少的费用。

qq_51499083的博客 4506

To Fill or Not to Fill加油站问题

题目描述: 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. Dif

u011415955的专栏 661

【PAT甲级 - C++题解】1033 To Fill or Not to Fill

📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!

Newin2020的博客 711

牛客网考研机试题To Fill or Not to Fill【区间贪心】

To Fill or Not to Fill 题目 由于有高速公路,从杭州开车到任何其他城市都很方便。但由于汽车的油箱容量有限,不得不在途中找加油站加油。在不同的加油站,加油的价格可能不同。请设计最便宜的路线。 思路: ...

hfut橘生淮南的博客 1073

PTA-To Fill or Not to Fill (加油问题)(贪心)

7-3 To Fill or Not to Fill (30 分) 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 dif

qq_52488169的博客 1020

PAT甲级题目翻译+答案 AcWing(贪心)

1033 To Fill or Not to Fill (25 分) 题意 : 坐标轴上有n个加油站,给出每个加油站的位置和油价格,给出总路程长度和油箱最大容量,以及每升油平均跑多少路,最开始油箱是空的 如果到不了终点,输出最多能到达多少路程;如果能到达终点,输出最低价格 思路 : 按照坐标给每个加油站排序,记得加上终点 如果第一个加油站不在起始点,return 对于当前的加油站,要找到它 范围内(油箱满) 中第一个比当前便宜的;如果没有,就找范围内相对最便宜的;如果也没有,说明无法到达终点。可以统一

m0_51448653的博客 1283

PAT 甲级 1033 To Fill or Not to Fill (25 分) 加油站问题-贪心

题意: 一个人要从0位置开车到D位置,开始车里没有油,路上有一些加油站可以任意加油,但是油有不同的价格 问能不能到达D位置,能到达的话输出最小花费,不能到达输出最远到达距离 思路: 从开始位置加油,往后走,但是加多少油我们不确定,因为假如后面有一个加油站的油便宜,那我们到这个加油站加油,走后面的路程就会花费更小,前提是我们能到这样的加油站; 如果当前加油站加满能到达的后面的加油站油价都大...

床前明月光 415

PAT 1033. To Fill or Not to Fill (25)

题目说明:在一条路上有N个加油站,给出每个加油站的价格和距离,计算到目的地的最小花费。油箱有最大容量,若无法到达目的地,计算出最大能走的距离。 思路:贪心算法。 首先按照距离升序排序。 遍历一次,判断能否走到目的地。这里需要注意第一个站距离大于0的情况。 再遍历一次,计算花费。对第i个站,判断i+1站是否更便宜,若是,加到刚好能到i+1站;否则,找到下一个更便宜的站j,判断油量是否足够到达

彼岸大鱼的专栏 498
上一篇: HDOJ 2124 Repair the wall 九度教程第24题 贪心 水~
下一篇: CCF 201903-2 二十四点 用栈模拟简单计算器
RPG_Zero
博客等级 码龄8年 77粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值