2022蓝桥杯省赛——砍竹子

news/2024/12/28 21:34:15/

问题描述

这天, 小明在砍竹子, 他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的 高度为 hi​。

他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为 H, 那么用一次魔法可以把这一段竹子的高度都变为,其中⌊x⌋ 表示对 x 向下取整。小明想知道他最少使用多少次魔法可让所有的竹子的高度都变为 1 。

输入格式

第一行为一个正整数 n,表示竹子的棵数。

第二行共 n 个空格分开的正整数 hi​, 表示每棵竹子的高度。

输出格式

一个整数表示答案。

样例输入

6
2 1 4 2 6 7

样例输出

5

样例说明

其中一种方案:

214267

共需要 5 步完成。

评测用例规模与约定

对于 20% 的数据,保证 n≤1000,hi​≤10^6 。对于 100% 的数据,保证 n≤2×10^5,hi​≤10^18。

运行限制

语言最大运行时间最大运行内存
C++2s256M
C2s256M
Java5s256M
Python310s256M

问题分析

把每棵竹子砍到1,每砍一次计数器加1;再回来看第i和第i-1棵竹子在砍的时候是否有出现相同的高度,每出现一次计数器减1。

我们需要建立一个二维数组,每一行存储一棵竹子从原始高度到1的高度变化。二维数组的行数我们已知是n,我们还需要知道它的列数。从评测用例规模中我们可以看到,竹子的最大高度为10^18,通过循环我们易求出二维数组的列数最大值是m=6。

 

在构建二维数组的同时,进行计数器加操作,易得此时count=7。但是,通过这个二维数组我们无法进行计数器减操作。因此,为了方便计算,我们将该二维数组左右翻转,格式仍保持左对齐,得到如下形式:

这样一来,我们就能很直观地看出来,有两次砍竹子的动作是多余的,于是执行两次计数器减操作。

Python代码如下:

import mathH=10**18  # 最大高度
n=int(input())  # 竹子的棵数
a=list(map(int,input().split()))# 砍竹子
def cut(h):return int(math.sqrt(int(h/2)+1))# 假设最多需要砍m次,求m
m=-1
for i in range(10):H=cut(H)if H==1:m=i+1  # i是从0开始计的,而m最小是1,故加一break
# print(m)h=[[] for i in range(n)]count=0  # 所求次数# 构造二维数组
for i in range(n):hh=a[i]h[i].insert(0,hh)while hh>1:hh=cut(hh)h[i].insert(0,hh)  # 每次都插到行首,这样就能实现二维数组的左右翻转count+=1# 逐列扫描二维数组
for j in range(1,m+1):  # 列标for i in range(1,n):  # 行标if j<len(h[i]):if j<len(h[i-1]) and h[i][j]==h[i-1][j]:  # 当前的竹子和前一棵竹子高度一致count-=1else:continueprint(count)

但是我这个代码的通过率只有65%,目前还不知道哪里需要改进,欢迎读者批评指正。


http://www.ppmy.cn/news/42456.html

相关文章

抽象类的使用

目录 什么是抽象类 抽象类的基本介绍 抽象类的注意事项和使用细节 抽象类习题 第一题 第二题 抽象模板设计模式 什么是抽象类 当父类的一些方法不能确定时&#xff0c;可以用abstract关键字来修饰该方法&#xff0c;这个方法就是抽象方法&#xff0c;用abstract来修饰该…

ModelNet40数据集

跑PointNet,modelnet40数据集时; 有些人直接用.off文件;——【CAD模型】普林斯顿形状Banchmark中的.off文件遵循以下标准&#xff1a; OFF文件全是以OFF关键字开始的ASCII文件。下一行说明顶点的数量、面片的数量、边的数量。 边的数量可以安全地省略。对模型不会有影响(可以为…

【调试记录】QT中使用多线程导致的死锁

示例代码 #include <QApplication> #include <QWidget> #include <QTimer> #include <thread> #include <mutex>using namespace std::chrono_literals;class Window : public QWidget{ public:Window(QWidget *parent nullptr): QWidget(pare…

tocbot生成文章目录

学习链接 github上的tocbot npmjs上的tocbot 效果图 使用步骤 1. 安装tocbot npm install tocbot --save2. vue组件中使用引入tocbot 只需要引入tocbot&#xff0c;然后调用tocbot.init(…)&#xff0c;指定提取的文章内容所在的dom&#xff0c;以及要把生成的目录放到哪个…

数据分析师 ---- SQL强化(2)

数据分析师 ---- SQL强化(2) 文章目录数据分析师 ---- SQL强化(2)题目一&#xff1a;SQL实现文本处理题目二&#xff1a;语种播放量前三高所有歌曲总结&#xff1a;题目一&#xff1a;SQL实现文本处理 现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,…

验证码识别过程中切割图片的几种方案

目录 方案一&#xff1a;图片均分 方案二&#xff1a;寻找轮廓并截取 方案三&#xff1a;聚类算法 方案四&#xff1a;垂直投影法 源码下载 在用机器学习识别验证码的过程中&#xff0c;我们通常会选择把验证码中的各个字符切割出来然后单独识别&#xff0c;切割质量会直接…

Leetcode.2521 数组乘积中的不同质因数数目

题目链接 Leetcode.2521 数组乘积中的不同质因数数目 Rating &#xff1a; 1413 题目描述 给你一个正整数数组 nums&#xff0c;对 nums所有元素求积之后&#xff0c;找出并返回乘积中 不同质因数 的数目。 注意&#xff1a; 质数 是指大于 1 且仅能被 1 及自身整除的数字。…

linux替换jar中的文件(小修改,大修改还是整包发布稳妥)

当我们上线某个应用发现有个小bug需要修改,而且改动的地方并不是很多,比如,修改application.yml文件或者替换几个class文件,此时如果找到源文件修改后重新打包替换重启有点繁琐,就可以使用此方式修改。 目录 修改配置文件 修改class文件 附录:jar的命令 修改配置文件 …