【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根竹子,长度为ln = 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根竹子,长度为ln = 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.mzph.cn/news/670464.shtml

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

相关文章

电商开放API商品采集接口、关键字搜索接口,获取商品ID、商品主图接口

API是application programming interface&#xff08;应用程序接口&#xff09;的简称&#xff0c;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。…

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验&#xff0c;加之导入AWR dump数据&#xff0c;导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1&#xff1a;预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…

Linux Shell编程系列--变量的定义与使用

一、目的 上一篇我们简单介绍了shell脚本的组成以及如何运行一个shell脚本&#xff0c;本篇将详解讲解shell中的变量。在Shell脚本中&#xff0c;变量是用来存储和处理数据的基本结构。 二、介绍 1、定义变量 变量名与等号&#xff08;&#xff09;后跟值来定义一个变量&#…

考研数据结构笔记(1)

数据结构&#xff08;1&#xff09; 数据结构在学什么&#xff1f;数据结构的基本概念基本概念三要素逻辑结构集合线性结构树形结构图结构 物理结构&#xff08;存储结构&#xff09;顺序存储链式存储索引存储散列存储重点 数据的运算 算法的基本概念什么是算法算法的五个特性有…

VXLAN:虚拟化网络的强大引擎

1.什么是VXLAN VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN协议的一种扩展。VXLAN的特…

【Spring】Spring事务和事务传播机制

文章目录 什么是事务事务的操作Spring 中事务的实现Spring编程式事务Spring 声明式事务 TransactionalTransactional作用Transactional 详解rollbackFor事务隔离级别Spring 事务隔离级别Spring 事务传播机制 什么是事务 事务&#xff08;Transaction&#xff09;是一个程序中一…

【vue-baidu-map】百度地图组件,实现精准搜索,当前定位功能

实现效果&#xff1a; 代码如下&#xff1a; //引入地图组件 <bmap ref"bmap" map-confirm"confirmPosition" />confirmPosition() {const _this this.$refs.bmapconst center _this.centervar point center.lng , center.latconsole.log(阀控…

JavaEE作业-实验一

目录 1 实验内容 2 思路 3 核心代码 &#xff08;1&#xff09;前端核心代码&#xff1a; &#xff08;2&#xff09;后端核心代码&#xff1a; 4 实验结果 1 实验内容 用Servlet JSP JavaBean实现登录功能 2 思路 ①建好web项目,创建数据库 ②建立两个简单的前端页…

HarmonyOS Next开发----k线图滑动问题

前言 最近做股票软件鸿蒙版本的适配&#xff0c;K线趋势图的手势交互上遇到了问题&#xff0c;这里记录下~ 功能需求&#xff1a; 实现k线趋势图滑动及fling的效果 思路&#xff1a; 1. 借鉴Flutter版本的思路&#xff0c;在K线趋势图上面叠加一个Scroll布局&#xff0c;使…

parted命令进行磁盘分区

1.使用lsblk 查看可用的磁盘 可以看到有sdb sdc两个物理盘还未挂载 2.使用parted命令分区(以sdb为例) 按需要把sdb分成4个逻辑分区 新建磁盘标签类型为gpt 出现提示,输入yes 开始分区: (1)输入mkpart回车,提示输入分区名称,按习惯可命名为sdb1(后面依次sdb2、sdb3)…

部署篇 | MatrixOne与MySQL全面对比

MatrixOne是一款高度兼容MySQL语法的HTAP数据库&#xff0c;在大部分场景下可以直接实现对MySQL的替换。 作为一款开源数据库&#xff0c;MatrixOne 选用对开发者友好的 Apache-2.0 License&#xff0c;支持在主流的 Linux 和 MacOS 系统中直接进行物理部署。在部署方式上&…

JVM 性能调优 - 参数基础(2)

查看 JDK 版本 $ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) 查看 Java 帮助文档 $ java -help 用法: java [-options] class [args...] …

Python中的for循环用法详解,一文搞定它

文章目录 for循环1.for循环的基本语法&#xff08;1&#xff09;遍历不等长多级容器&#xff08;2&#xff09;遍历不等长多级容器&#xff08;3&#xff09;遍历等长的容器 2.变量的解包3.for...else【详细讲解】4.range对象5.总结6.打印 1 ~ 10 跳过57.打印菱形小星星 for循环…

Flink 动态表 (Dynamic Table) 解读

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

docer compose部署simple-docker

简介 一个看似简陋但是功能足够用的docker管理工具 安装 创建目录 mkdir -p /opt/simple-docker cd /opt/simple-docker 创建并启动容器 编写docker-compose.yml文件,内容如下 version: 3 services: redis: image: redis:latest restart: always web: image: registry.cn-…

HR看了都想点开的简历:吸睛模板+撰写技巧

工作致富的第一步&#xff1a;写一份好的简历。一个独特、简单、清晰的个人简历模板可以更好地吸引雇主的注意和兴趣&#xff0c;并帮助你在许多求职者中脱颖而出。如何制作一份令人印象深刻的简历&#xff1f;巧妙地使用个人简历模板是一个不错的选择。在本文中&#xff0c;我…

线性代数:矩阵的初等变换

目录 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理 一、初等行变换 行阶梯 / 行最简 性质 二、矩阵的标准型 三、矩阵的等价 四、初等矩阵 五、重要性质与定理

租游戏服务器多少钱1个月?一年价格多少?

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

SpringBoot注解--04--01--注解@Mapper在IDEA中自动注入警告的解决方案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 问题原因 解决方案方法1&#xff1a;为 Autowired 注解设置required false方法2&#xff1a;用 Resource 替换 Autowired方法3&#xff1a;在Mapper接口上加上Repo…

跟着pink老师前端入门教程-day19

一、移动WEB开发之流式布局 1、 移动端基础 1.1 浏览器现状 PC端常见浏览器&#xff1a;360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器。 移动端常见浏览器&#xff1a;UC浏览器&#xff0c;QQ浏览器&#xff0c;欧朋浏览器&#xff0…