2022蓝桥杯省赛——砍竹子

这篇具有很好参考价值的文章主要介绍了2022蓝桥杯省赛——砍竹子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

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

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

输入格式

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

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

输出格式

一个整数表示答案。

样例输入

6
2 1 4 2 6 7

样例输出

5

样例说明

其中一种方案:

214267

2022蓝桥杯省赛——砍竹子

共需要 5 步完成。

评测用例规模与约定

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

运行限制

语言 最大运行时间 最大运行内存
C++ 2s 256M
C 2s 256M
Java 5s 256M
Python3 10s 256M

问题分析

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

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

2022蓝桥杯省赛——砍竹子

 

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

2022蓝桥杯省赛——砍竹子

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

Python代码如下:

import math

H=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-=1
        else:
            continue

print(count)

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

2022蓝桥杯省赛——砍竹子文章来源地址https://www.toymoban.com/news/detail-405972.html

到了这里,关于2022蓝桥杯省赛——砍竹子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【十三届蓝桥杯省赛解析javaC组】

    题目描述 解题思路 A题相对比较简单,这题有两种解法 第一种是可以利用记事本把文本复制,然后自己手动排序 第二种是写代码:具体思路是定义一个字符串用来储存问文本,然后把文本转成字符型数组,利用Arrays.sort对字符型数组进行排序,最终实现字符的排序 代码示例

    2023年04月20日
    浏览(29)
  • 2019 第十届蓝桥杯省赛A组题解

    本次试题难度(对专业算法竞赛选手来说)不大,但是考验基本的编程基本功和数学思维。估计完成80%即可获得省一进入决赛(根据一些公开的反馈,如果有准确数据请告诉我),因此更多的是需要细心。 至于C/C++还是Java我觉得不重要,因为题目除了顺序有点不同,内容是一

    2023年04月09日
    浏览(37)
  • 蓝桥杯省赛无忧 STL 课件13 list

    以下是一个示例,展示如何使用listt容器: 在上述示例中,我们首先创建了一个list容器myList,然 后使用push_back()和push_front()函数分别在链表尾部和头 部插入元素。最后,使用范围基于范围的for循环遍历链 表并输出元素。 需要注意的是,由于list是双向链表,因此插入和删除操

    2024年02月02日
    浏览(26)
  • 蓝桥杯省赛PREV-348试题1:算术填符号

    资源限制 内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s 匪警请拨110,即使手机欠费也可拨通! 为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练! 某批警察叔叔正在

    2023年04月09日
    浏览(28)
  • 【蓝桥杯省赛真题18】python阴影图形面积 青少年组蓝桥杯python编程省赛真题解析

    目录 python阴影图形面积 一、题目要求 1、编程实现 2、输入输出

    2023年04月23日
    浏览(30)
  • 最小剩余空间-第11届蓝桥杯省赛Python真题精选

    [导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python 蓝桥杯真题解析100讲》, 这是解读系列的第31讲。 最小剩余空间, 本题是2020年6月20日举办的第11届蓝桥杯青少组Pyt

    2024年01月17日
    浏览(35)
  • 第十三届蓝桥杯省赛 python B组复盘

    😎🥳😎 备战蓝桥杯第一弹–复盘 思路 (当时第一次参加蓝桥杯,当时现场心里小鹿乱撞,用排序输出了还每个字母数数验证一番(滑稽)) 字符串转列表 列表排序 列表转字符串 代码 思路 当时在现场程序没跑出来 想着那个数取余2余1,取余4余1,取余8余1可以只看取余8余1的,

    2023年04月20日
    浏览(29)
  • 第十四届蓝桥杯省赛C++ A组浅析

    (仅个人看法,对错未知,可以当做口胡QAQ)如有错误请大佬们指出,有更好做法欢迎留言! 暴力判不多说了 看到很多搜的,提供一个dp做法 d p [ i ] [ j ] 表示前 i 道题,答对 j 道的方案数 dp[i][j]表示前i道题,答对j道的方案数 d p [ i ] [ j ] 表示前 i 道题,答对 j 道的方案数

    2023年04月13日
    浏览(29)
  • 第十四届蓝桥杯省赛PythonA/C组------翻转

    小蓝用黑白棋的n个棋子排成了一行,他在脑海里想象出了一个长度为n的01串T,他发现如果把黑棋当做1,白棋当做0,这一行棋子也是一个长度为n 的01串S。 小蓝决定,如果在S中发现一个棋子和它两边的棋子都不一样,就可以将其翻转变成另一个颜色。也就是说,如果S中存在

    2024年01月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包