Platforms Jumping(贪心,处理策略)

news2025/6/28 12:46:54

文章目录

  • 题目描述
    • 输入格式
    • 输出格式
    • 样例输入1
    • 样例输出1
    • 样例输入2
    • 样例输出2
    • 样例输入3
    • 样例输出3
    • 提交链接
    • 提示
  • 解析
  • 参考代码

题目描述

有一条宽度为 n n n 的河流。河的左岸是 0 0 0 单元格,右岸是 n + 1 n+1 n+1 单元格(更正式地说,这条河可以表示为一串从 0 0 0 n + 1 n+1 n+1 编号,一共 n + 2 n+2 n+2 单元格)。河上还有 m m m 个木制平台,其中 i i i 个平台的长度为 c i c_i ci (因此 i i i 个平台占用了河上 c i c_i ci 个连续的单元格)。可以保证平台长度之和不超过 n n n

您现在站在 0 0 0 处,并希望以某种方式到达 n + 1 n+1 n+1 。如果您站在位置 x x x 上,您可以跳到范围 [ x + 1 , x + d ] [x+1,x+d] [x+1,x+d] 中的任意位置。但是你并不喜欢水,所以你只能跳到属于某个木制平台的单元格。例如,如果是 d = 1 d=1 d=1 ,您只能跳到下一个位置(如果它属于木制平台)。您可以假设单元格 0 0 0 n + 1 n+1 n+1属于木质平台。

您想知道的是,如果您可以将任意平台向左或向右移动任意次数(可能是零),只要它们不相交(但两个平台可以相碰),那么是否有可能从 0 0 0 到达 n + 1 n+1 n+1 。这也意味着您不能改变平台的相对顺序。
注意,在开始跳跃之前,应先移动平台(换句话说,先移动平台,然后开始跳跃)。

例如,如果有 n = 7 n=7 n=7 m = 3 m=3 m=3 d = 2 d=2 d=2 c = [ 1 , 2 , 1 ] c=[1,2,1] c=[1,2,1] ,那么从 0 0 0 到达 8 8 8 的方法之一是遵循以下步骤:
在这里插入图片描述 n = 7 n=7 n=7

输入格式

输入的第一行包含三个整数 n 、 m n、m nm d ( 1 ≤ n , m , d ≤ 1000 , m ≤ n ) d(1 \leq n,m,d \leq 1000,m \leq n) d(1n,m,d1000,mn),分别是河流的宽度、平台的数量和跳跃的最大距离。

输入的第二行包含 m m m 个整数, c 1 , c 2 , . . . , c m ( 1 ≤ c i ≤ n , ∑ i = 1 m c i ≤ n ) c_1,c_2,...,c_m(1 \leq c_i \leq n,\sum\limits_{i=1}^{m}c_i \leq n) c1,c2,...,cm(1cin,i=1mcin),其中 c i c_i ci 是 第 i i i 个平台的长度。

输出格式

如果无法从 0 0 0 到达 n + 1 n+1 n+1 ,则在第一行打印 NO。否则,第一行打印 YES,第二行打印长度为 n n n 的数组 a a a - 河单元格序列(不包括单元格 0 0 0 和单元格 n + 1 n+1 n+1 )。

如果单元格 i i i 不属于任何平台,则 a i a_i ai 应为 0 0 0 。否则, a i a_i ai 应等于单元格 i i i 所属平台的索引( 平台按输入顺序从 1 1 1 m m m 编号)。

注意所有等于 1 1 1 a i a_i ai 应构成长度为 c 1 c_1 c1 的数组 a a a 的连续子块,所有等于 2 2 2 a i a_i ai 应构成长度为 c 2 c_2 c2 的数组 a a a 的连续子块,…,所有等于 m m m a i a_i ai 应构成长度为 c m c_m cm 的数组 a a a 的连续子块。 a a a 2 2 2 的最左端位置应大于 1 1 1 的最右端位置, a a a 3 3 3 的最左端位置应大于 2 2 2 的最右端位置,…, a a a m m m 的最左端位置应大于 m ? 1 m?1 m?1 的最右端位置。

样例输入1

7 3 2
1 2 1

样例输出1

YES
0 1 0 2 2 0 3 

样例输入2

10 1 11
1

样例输出2

YES
0 0 0 0 0 0 0 0 0 1 

样例输入3

10 1 5
2

样例输出3

YES
0 0 0 0 1 1 0 0 0 0 

提交链接

https://hydro.ac/d/lp728/p/15

提示

请看第一个例子:答案是 [ 0 , 1 , 0 , 2 , 2 , 0 , 3 ] [0,1,0,2,2,0,3] [0,1,0,2,2,0,3] 。你执行的跳跃序列是 0 → 2 → 4 → 5 → 7 → 8 0→2→4→5→7→8 024578

再看第二个例子:如何放置平台并不重要,因为你总是可以从 0 0 0 跳到 11 11 11

再看第三个例子:答案是 [ 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 ] [0,0,0,0,1,1,0,0,0,0] [0,0,0,0,1,1,0,0,0,0]。你的跳跃顺序是 0 → 5 → 6 → 11 0→5→6→11 05611

解析

此题的难点在于输出木板的位置。若单纯的判断是否能够到达,是比较简单的,直接每次跳跃最大距离。

现在每次跳跃最大距离可能导致木板没有办法放置。处理的办法,先把所有的木板按顺序放置再右边,同时记录编号。

n o w now now 记录当前的位置,若前面有木板,先走到木板的右边再开始跳,每次跳跃最大距离,落脚点若为水,则移动一个木板到当前的落脚点。

这样操作之后,能保证木板一定是在河流范围内且完美放下。

参考代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 9;
int n , m , d , c[maxn] , plat[maxn];
int main()
{
	cin >> n >> m >> d; //河流的宽度  平台的数量  跳跃的最大距离
	for(int i = 1; i <= m; i++)
		cin >> c[i];  //第i个平台的长度
	/*按顺序,先全部放在右边*/
	int x = n;
	for(int i = m; i >= 1; i--)
	{
		while(c[i])
		{
			plat[x--] = i;
			c[i]--;
		}
	} 
	int now = 0;
	while(1)
	{
		/*走到当前木板的最右边再开始跳,体现贪心*/
		while(now + 1 < n + 1 && plat[now + 1])
			now++;
		if(now + d >= n + 1)
			break;
		/*需要木板,找到最左边木板的左右端点*/
		 
		if(!plat[now + d])
		{
			int lpos = - 1 , rpos;
			for(int i = now + d; i <= n; i++)
			{
				if(plat[i])
				{
					lpos = i;
					break;
				}
			}
			if(lpos == -1)
			{
				cout << "NO";
				return 0;
			}
			for(int i = n; i > now + d; i--)
			{
				if(plat[i] == plat[lpos])
				{
					rpos = i;
					break;
				}
			}	
			while(!plat[now + d])
			{
				swap(plat[rpos] , plat[lpos - 1]);
				rpos--;
				lpos--;
			}
		}
		now += d;
	}
	cout << "YES" << endl;
	for(int i = 1; i <= n; i++)
		cout << plat[i] << " ";
	return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APP被DDoS攻击时,企业应该如何防护?

某平台遭到分布式拒绝服务攻击&#xff0c;大规模、持续性的攻击&#xff0c;导致平台的APP、网站的部分用户出现间歇性无法登录、加载失败或缓慢等情况。据了解&#xff0c;平台在一个月的时间内陆续遭受到近30次的网络攻击。在这段时间内&#xff0c;平台不断地接收到短时间、…

在Debian 12系统上安装Docker

Docker 在 Debian 12 上的安装 安装验证测试更多信息引言 在现代的开发环境中,容器技术发挥着至关重要的作用。Docker 提供了快速、可靠和易于使用的容器化解决方案,使开发人员和 DevOps 专业人士能够以轻松的方式将应用程序从一个环境部署到另一个环境。 Docker 的安装过程在…

稀碎从零算法笔记Day45-LeetCode:电话号码的字母组合

题型&#xff1a;映射、回溯算法、递归 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出…

python如何输入多行

Python中的Input()函数在输入时&#xff0c;遇到回车符&#xff0c;那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形&#xff0c;当然输入空行也是允许的。 方法1&#xff1a;利用异常处理机制实现 lines[] while True:try:lines.append(input())except:…

【Java基础题型】矩阵的对角线求和

一、题目-矩阵 求一个33矩阵对角线元素之和。 输入格式 矩阵 输出格式 主对角线 副对角线 元素和 样例输入 1 2 3 1 1 1 3 2 1 样例输出 3 7 二、参考的知识 这里给大家送点英语单词&#xff0c;记得学习&#xff1a; p r i m a r y. adj.主要的&#xff1b;初…

2024.4.8Morris中序遍历(线索二叉树)学习

这次博主在学习完知识点和代码之后&#xff0c;准备对这个知识重新进行整理总结。站在一个初学者的角度来看待这个知识点&#xff0c;在他人的讲解基础上加一点点自己的理解&#xff0c;并记录下来。以加深自己的理解&#xff0c;并且希望能够帮助到你。博主是一个初学者&#…

vue的监视属性

目录 1. 场景引入2. watch3. 深度监视4. 监视属性简写5. 小结 1. 场景引入 在实际开发中&#xff0c;有时开发者需要根据某个属性的变化&#xff0c;做出相应的决策&#xff0c;因此Vue为开发者提供了watch.这一监视属性&#xff0c;用于实现此类需求。比如下面这个场景&…

【muzzik 分享】原生预览调试!我给Cocos加了个新功能,原生开发者福音

前言 一年一度的征稿到了&#xff0c;倒腾点存货&#xff0c;在之前阅读云风大佬文章的时候&#xff0c;发现他的引擎调试机制是在 手机上实时刷新预览&#xff0c;而不是在PC上调试&#xff0c;作为一个 Cocos 原生开发者&#xff0c;我深有体会&#xff0c;主要有以下原因 C…

一、Spring基础 --- 基础内容(二) (咕P4)

一、IOC容器 1.1 基础 1.1.1 容器 1、Spring框架的主要功能是通过其核心容器来实现的。2、Spring容器是生成Bean的工厂&#xff0c;它负责创建Bean的实例&#xff0c;并管理其生命周期。所有的组件都被当成Bean处理&#xff0c;例如数据源、Hibernate的SessionFactory、事务管…

【Keil5-报错】

Keil5-报错 ■ 调试烧录出现问题■ 烧录程序失败■ 编译报错 .\Objects\stm32h7_tms.axf: Error: L6218E: Undefined symbol __heap_base (referred from alloc.o).■ Keil5 load 出错■ No Space in execution regions with .ANY selector matching startup ...■ Execution r…

寄快递的省钱小妙招,看看你能知道多少

首先就是从包裹的重量上和体积上&#xff0c;我们都知道快递员上门取件都是需要称重的&#xff0c;我们能做的就是尽量压缩包裹的体积来减少快递的运费价格。然后是使用自己的包装袋来打包行李&#xff0c;快递员的袋子也是需要另外花费的。对于一些不容易损坏的货物来说&#…

基于SVM的时间序列预测模型matlab代码

整理了基于SVM的时间序列预测模型matlab代码&#xff0c; 包含数据集。采用了四个评价指标R2、MAE、MBE、MAPE对模型的进行评价。SVM模型在数据集上表现非常好。 Mean squared error 0.000180613 (regression) Squared correlation coefficient 0.995639 (regression) Mea…

了解单链表

27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 思路一&#xff1a; 创建新的数组&#xff0c;遍历原数组&#xff0c;将不为val的值放到新数组当中。空间复杂度不为O(1) 思路二&#xff1a;双指针法 我们设置两个指针src&#xff08;源数据&#xff09;和dst&#xf…

MOS管的判别符号记忆与导通条件

参考链接 MOS管的判别与导通条件 (qq.com)https://mp.weixin.qq.com/s?__bizMzU3MDU1Mzg2OQ&mid2247520228&idx1&sn5996780179fbf01f66b5db0c71622ac3&chksmfcef6c86cb98e590e3d3734ee27797bdded17b6b648b3b0d3b1599e8a4496a1fa4e457be6516&mpshare1&…

[CUDA 学习笔记] 矩阵转置算子优化

矩阵转置算子优化 矩阵转置是一种基础的矩阵操作, 即将二维矩阵的行列进行反转. 本文主要围绕行主序的二维单精度矩阵的转置考虑相关的优化. 以下 kernel 笔者均是在 NVIDIA V100 (7.0 算力) 上进行测试的, 且选择矩阵的行列维度大小为 M2300 N1500. Version 0. 朴素实现 _…

流量分组新增两大新规则;Network SDK更新618大促版本;综合报表支持实时新用户指标 | TopOn产品更新

「TopPro 每月产品速递」是由TopOn最新推出的产品专栏&#xff0c;将会以月为周期梳理TopOn最新产品动态&#xff0c;致力于为互联网从业者提供优质服务&#xff0c;引领行业产品发展。 TopPro | 四月产品速递 2023.04.01-04.27 01 流量分组新增两大新规则 // 功能描述 *…

面向AI编程,AI可以为我们做哪些事情

本来这篇文章是2023-10月发出的&#xff0c;放在草稿箱比较久了。今天重新捡起来发下。内容很长&#xff0c;很干。希望对大家有启发&#xff0c;编程路上提升效率。 背景 基本上以前我们出了bug都是百度&#xff0c;但随着AI的出现&#xff0c;对标百度给出的答案。发现AI实在…

python爬虫-------JsonPath(第十九天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Pytorch中nn.Linear使用方法

nn.Linear定义一个神经网络的线性层&#xff1a; torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数biasTrue # 是否包含偏置)nn.Linear其实就是对输入&#xff08;n表示样本数量&#xff0c;i表示样本特…

国产低代码工具,轻松搞定数据迁移

在日常的业务系统升级或者数据维护过程中&#xff0c;数据迁移是各个企业用户不得不面临的问题&#xff0c;尤其是数据迁移过程中要保障数据完整性、统一性和及时性&#xff0c;同时也需要注意源数据中的数据质量问题&#xff0c;比如缺失、无效、错误等问题&#xff0c;需要在…