【2024.2.5练习】砍竹子(25分)

题目描述


题目分析

考虑题目是否满足贪心。每次施展魔法会使一段连续的竹子高度变为一半左右的平方根。根据样例,似乎每次让最高的竹子变短就能得到最优解。

假设魔法一次只能对一根竹子使用,永远不出现连续相同高度的竹子,那么显然无论使用魔法的顺序如何,使用次数永远都是固定的;如果会出现连续相同的竹子,先对这排竹子中最高的施展魔法不会对其他竹子的变短次数造成影响。而如果率先对相同高度且不是最高的竹子变短,则可能会丧失更多竹子变成连续的机会,故贪心策略成立。

接下来是如何检测最高竹子和连续相同竹子,如何设计算法是难点。首先想到采用map容器给竹子高度排序,排序过程的复杂度为O(nlogn),不会超时;然后使用深度优先搜索检测最大竹子两个方向上所有相同连续的竹子,让这些竹子一起变短。经计算最大高度的竹子最多经过6次变短高度就能变成1,因此魔法的最多施展次数约为10^6次,如果每次都经过一遍搜索会超时。

为了避免重复检测连续的竹子,对DFS进行改良,每次搜索到连续竹子,在搜索过的竹子上分别添加s\t标记,标志从第s根到第t根的竹子都是相同高度的,从复杂度上将所有相同高度的连续竹子化为一根,差不多是某种程度上的离散化,免去了重复的搜索。


我的代码

long long型数据的范围是9\times 10^{18},可以用来记录竹子的高度。敲了几行代码后发现只用一个dfs很难处理已经搜索过的竹子,因此使用两个dfs,分别向左和向右搜索。

在代码过程中由于不熟悉stl容器语法踩了很多坑:比如迭代器的失效问题;以及multimap.erase(key)会将对应的所有value都删除。

#include <iostream>
#include <algorithm>
#include <map>
#include <stack>
#include <math.h>

using namespace std;
typedef long long ll;
int n; //总竹子个数
ll lenth[200002]; //所有竹子高度
int sign[200002][3]; //sign[n][0]和sign[n][1]分别储存了连续竹子的起点和终点坐标,
//sign[n][2]为连续竹子的的关键坐标(储存在map内)
int other[200002]; //多余不用搜索的竹子
multimap<ll, int> M; //从低到高竹子对应的坐标
multimap<ll, int>::iterator it; //迭代器,用于取出最后一个元素

stack<int> S; //搜索过的竹子
int large; //搜索过的竹子中序号最大的
int small; //搜索过的竹子中序号最小的

/*向右深度优先搜索*/
void dfs1(int n, ll l) { //搜索第n根竹子,长度为l
	n = sign[n][1];
	large = max(large, n); //记录搜索终点
	if (lenth[n + 1] == l) { //向右搜索
		S.push(sign[n + 1][1]); //起点以外搜索过的竹子入栈
		S.push(sign[n + 1][2]); //替代多余的关键坐标
		dfs1(n + 1, l);
	}
}
/*向左深度优先搜索*/
void dfs2(int n, ll l) { //搜索第n根竹子,长度为l
	n = sign[n][0];
	small = min(small, n); //记录搜索起点
	if (lenth[n - 1] == l) { //向左搜索
		S.push(sign[n - 1][0]); //起点以外搜索过的竹子入栈
		S.push(sign[n - 1][2]); //替代多余的关键坐标
		dfs2(n - 1, l);
	}
}
int main() {
	//初始化参数
	for (int i = 0; i <= 200002; i++)
	{
		lenth[i] = 0;
		sign[i][0] = i;
		sign[i][1] = i;
		sign[i][2] = i;
		other[i] = 0;
	}
	//输入总竹子数
	cin >> n;
	//输入竹子高度
	for (int i = 1; i <= n; i++)
	{
		ll L;
		cin >> L;
		lenth[i] = L; //储存在数组
		pair<ll, int> P(L, i); //储存在map容器
		M.insert(P);
	}
	/*循环取出最高竹子*/
	int ans = 0;
	int flag = 0; //循环停止的标志
	while (!flag)
	{
		large = 0;
		small = 200002;
		it = M.end();
		it--;//此时迭代器指向Map最后一个元素
		ll k = (*it).first;
		ll v = (*it).second;//获取键值对
		M.erase(it);//删除当前容器元素
		if (k == 1) {
			flag = 1;
		}
		/*深度优先搜索*/
		if (!flag && other[v] != 1) {
			ans++;//记录搜索次数,即魔法施展次数
			dfs1(v, k);
			dfs2(v, k);
			lenth[v] = floor(sqrt(lenth[v] / 2 + 1));//更新关键竹子高度
			sign[v][0] = small;
			sign[v][1] = large;
			sign[v][2] = v;
			lenth[sign[v][0]] = lenth[v];
			lenth[sign[v][1]] = lenth[v];
			/*出栈操作*/
			while (S.size()) {
				int i = S.top();
				sign[i][0] = small;
				sign[i][1] = large;
				sign[i][2] = v;
				other[i] = 1;
				lenth[i] = lenth[v];
				S.pop();//更新两边竹子的高度,并清除多余的非关键坐标
			}
		}
		/*修改map容器存储*/
		ll nl = floor(sqrt(k / 2 + 1));
		pair<ll, int> P(nl, v);
		M.insert(P);//把新的高度存到Map中
	}
	cout << ans;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口幂等性

接口幂等性 如何实现幂等性实现方式一&#xff1a;数据库唯一主键实现方式二&#xff1a;Token机制实现方式三&#xff1a;数据库乐观锁实现方式四、加分布式锁 如何实现幂等性 其实实现幂等性的方案有不少&#xff0c;但是呢&#xff0c;这就得需要你根据不同的业务场景去选择…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型&#xff0c;所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起&#xff0c;创建一个通用的…

oracle 启动命令以及ORA-01033问题处理、删除归档日志

1 启动数据库:startup 2 关闭数据库&#xff1a;Shutdown immediate 3 查看监听状态&#xff1a;lsnrctl status 4 启动监听&#xff1a;lsnrctl start 5 停止监听&#xff1a;lsnrctl stop 常见问题 1、在服务器重启后会出现&#xff0c;Oracle ORA-01033: ORAC…

渗透测试-信息打点与架构分析细节梳理

渗透测试-信息打点与架构分析细节梳理 为了保障信息安全&#xff0c;我在正文中会去除除靶场环境的其他任何可能的敏感信息 什么是网站架构 网站架构包括网站的方方面面&#xff0c;下面是常见的内容&#xff1a; 前端&#xff08;Front-End&#xff09;&#xff1a; 使用Reac…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为k&#xff0c;有2^k-1个节点的二叉…

Pymysql之Connection中常用API

Connection中常用API 1、open() &#xff1a;检测数据库是否连接。 connect.open&#xff1a;如果数据库连接返回Trhe&#xff0c;否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后&#xff0c;重新进行连接。 import…

春节假期如何高效管理Shopee虾皮本土店?技巧都给你整理好了!

EasyBoss ERP 对于中国人最重要的春节即将来临&#xff0c;但对于运营Shopee、TikTok Shop等平台的卖家而言&#xff0c;他们的客户可不会过春节。为了不影响店铺的业绩&#xff0c;很多卖家在春节期间都还是照常运营店铺&#xff0c;但又不想错过和家人团圆的机会怎么办&…

《Java程序设计》实验报告(一)之Java语言基础

实验内容及步骤&#xff1a; 编写”hello world”应用程序。&#xff08;1&#xff09;代码&#xff1a; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } &#xff08;2&#xff09;运行…

惟客数据地产经营分析解决方案-构建数字化经营体系,提高精细化管理能力

惟客数据地产经营分析解决方案以拉通数据底座&#xff0c;以管理行为、量化考核、预警机制为核心&#xff0c;强化对经营风险的识别和解决&#xff0c;以终为始&#xff0c;通过高频高价值场景的应用适配&#xff0c;支撑企业在数字化时代中不断创新、转型&#xff0c;提升企业…

使用Pillow来生成简单的红包封面

Pillow库&#xff08;Python Imaging Library的后继&#xff09;是一个强大而灵活的图像处理库&#xff0c;适用于Python。Pillow 库&#xff08;有时也称 PIL 库&#xff09; 是 Python 图像处理的基础库&#xff0c;它是一个免费开源的第三方库&#xff0c;由一群 Python 社区…

SSL协议是什么?关于SSL和TLS的常见问题解答

SSL&#xff08;安全套接字层&#xff09;及其后继者TLS&#xff08;传输层安全&#xff09;是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用&#xff0c;但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…

VM 虚拟机和容器技术之间有什么区别?

随着云计算技术的不断发展&#xff0c;虚拟机和容器技术作为两种常见的虚拟化技术&#xff0c;被广泛应用于云计算领域。虽然虚拟机和容器技术都是虚拟化技术&#xff0c;但它们之间存在一些重要的区别。本文将详细介绍虚拟机和容器技术的区别&#xff0c;以便读者更好地了解这…

2.7:二叉树创建、先中后遍历、各个节点度的个数、深度

1.二叉树的创建、先中后遍历、各个节点度的个数、深度 程序代码&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 typedef char datatype;5 typedef struct node6 {7 datatype data;8 struct node *lchild;9 struct…

如何使用数据恢复软件恢复已删除的数据

本教程介绍如何使用奇客数据恢复软件有效地从各种存储系统中恢复已删除的数据&#xff1a; 您是否曾经不小心从系统中删除了数周或数月的工作成果&#xff1f; 如果是这样&#xff0c;那么请从您并不孤单这一事实中找到安慰。这种严重且后果严重的判断错误在世界各地的计算机…

【leetcode】深搜、暴搜、回溯、剪枝(C++)1

深搜、暴搜、回溯、剪枝&#xff08;C&#xff09;1 一、全排列1、题目描述2、代码3、解析 二、子集1、题目描述2、代码3、解析 三、找出所有子集的异或总和再求和1、题目描述2、代码3、解析 四、全排列II1、题目解析2、代码3、解析 五、电话号码的字母组合1、题目描述2、代码3…

21.HarmonyOS App(JAVA)自适应布局Layout使用方法

AdaptiveBoxLayout是鸿蒙操作系统中最具有特色的布局&#xff0c;可以方便开发者对组件的自适应排布。 AdaptiveBoxLayout是自适应盒子布局&#xff0c;该布局提供了在不同屏幕尺寸设备上的自适应布局能力&#xff0c;主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自动调…

LLM(5) | Encoder 和 Decoder 架构

LLM(5) | Encoder 和 Decoder 架构 文章目录 LLM(5) | Encoder 和 Decoder 架构0. 目的1. 概要2. encoder 和 decoder 风格的 transformer (Encoder- And Decoder-Style Transformers)原始的 transformer (The original transformer)编码器 (Encoders)解码器 (Decoders)编码器和…

2024三掌柜赠书活动第九期:Node.js从基础到项目实践(视频教学版)

目录 前言Node.js从基础到项目实践关于《Node.js从基础到项目实践(视频教学版)》编辑推荐内容简介作者简介图书目录书中前言/序言《Node.js从基础到项目实践(视频教学版)》全书速览结束语 前言 随着Web应用的快速发展&#xff0c;Node.js作为一种强大的JavaScript运行时环境&…

前端-Vue項目初始化

大家好我是苏麟 , 今天聊聊前端依赖 Ant Design Vue 快速初始化项目 . Ant Design Vue官网 : 快速上手 - Ant Design Vue (antdv.com) 初始化项目 找到文档->快速上手 脚手架命令 : npm install -g vue/cli 找到一个文件夹(不要在中文路径) 下打开cmd窗口输入脚手架命令 成…

Flink实战六_直播礼物统计

接上文&#xff1a;Flink实战五_状态机制 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧光棒免费…
最新文章