首页 > 其他分享 >蓝桥杯-砍竹子

蓝桥杯-砍竹子

时间:2023-03-23 22:46:40浏览次数:39  
标签:int ll 高度 height 蓝桥 竹子 store

蓝桥杯 2022 省赛 B 组 J 题:砍竹子

[蓝桥杯 2022 省 B] 砍竹子

题目描述

这天,小明在砍竹子,他面前有 \(n\) 棵竹子排成一排,一开始第 \(i\) 棵竹子的高度为 \(h_{i}\).

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

输入格式

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

第二行共 \(n\) 个空格分开的正整数 \(h_{i}\),表示每棵竹子的高度。

输出格式

一个整数表示答案。

样例 #1

样例输入 #1

6
2 1 4 2 6 7

样例输出 #1

5

提示

【样例说明】

其中一种方案:

\(214267\rightarrow 214262\rightarrow 214222\rightarrow 211222\rightarrow 111222\rightarrow 111111\)

共需要 5 步完成

【评测用例规模与约定】

对于 \(20 \%\) 的数据,保证 \(n \leq 1000, h_{i} \leq 10^{6}\) 。

对于 \(100 \%\) 的数据,保证 \(n \leq 2 \times 10^{5}, h_{i} \leq 10^{18}\) 。

题解

根据题意,我们可以得到两个结论:
1. 一颗竹子最多被砍伐 \(O(logh_i)\) 次后高度降为1
2. 若有连续几颗竹子高度相同,则施展一次“魔法”就能让这些竹子的高度一起下降
我们设置一个变量ans来储存操作次数。基于上述结论,我们将对每棵竹子每次操作后的高度记录在一个数组store中。再对竹子操作之前,可以先在数组store中查看该竹子是否和前面的竹子高度相同,若相同,则不必将ans自增。下面给出的代码的操作顺序是按照竹子的编号自小到大操作,但事实上的操作顺序应该是先将尽可能多的竹子变换为同一高度。尽管如此,两种操作顺序导致的最后结果是一致的。

#include <iostream>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 200001;
//存树高
ll height[N];
//存储先前树的高度
vector <ll> store[N];
int n;

ll update(ll x) 
{
    return sqrt(x / 2 + 1);
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) 
		cin >> height[i];
    int ans = 0;
    for(int i = 1; i <= n; i ++) 
    {
        while(height[i] > 1) 
        {
            bool flag = false;
            for(unsigned int j = 0; j < store[i - 1].size(); j++) 
            {
                ll temp = store[i - 1][j];
                //先前已存在高度相同的竹子,因此不必自增ans了
                if(height[i] == temp) 
                {
                    flag = true;
                    break;
                }
            }
            if(!flag) 
                ans++;
            store[i].push_back(height[i]);
            height[i] = update(height[i]);
        }
    }
	cout << ans;
    return 0;
}

时间复杂度为\(O(nlog^2n)\).

标签:int,ll,高度,height,蓝桥,竹子,store
From: https://www.cnblogs.com/parallel-138/p/17249663.html

相关文章

  • C++编程题(蓝桥杯)
        运行结果  #include<iostream>usingnamespacestd;voidjingsai1(){//chh:水深;chs:最初水下深度;intchh=0,chs=0;intI_depth=0;cou......
  • 2023.3.23蓝桥杯集训·每日一题
    今日复习的内容是背包问题。记得动态规划问题的初始化。AcWing3382.整数划分解题思路考虑到本题是将一个数划分为\(2\)的幂的和,而\(2\)的\(i\)幂是可以无限使用......
  • 蓝桥杯之迷宫
    蓝桥杯题解迷宫下图给出了一个迷宫的平面图,其中标记为11的为障碍,标记为00的为可以通行的地方。010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷......
  • 蓝桥楼赛第9期-修复未正确实现的实验类 题解
    题目描述程序存放的位置/home/shiyanlou/lab.py;实验类名应该为Lab;实验对象中不能插入重复标签;Python中对象引用问题,尤其如复合对象list,dict,tuple的......
  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......
  • 蓝桥杯嵌入式——I2C总线
    配置根据原理图进行配置    官方提供的文件 编程 首先编写一个读的函数1unsignedchareeprom_read(unsignedcharaddr)2{3unsignedchar......
  • 蓝桥楼赛第23期-工作文件整理归类 题解
    题目描述实小楼同学平常的工作比较繁杂,经常需要处理各类文档,几天时间桌面上就累积了一堆不同类型和名称的文档,显得十分杂乱。实小楼想通过Python编写一个脚本,能够自动归......
  • 第十三届蓝桥杯省赛 Java B 组 C题——字符统计(AC)
    目录​​1.字符统计​​​​1.题目描述​​​​2.输入格式​​​​3.输出格式​​​​4.数据范围​​​​5.原题链接​​​​2.解题思路​​​​3.Ac_code​​1.字符统计1.......
  • 第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)
    目录​​1.搬砖​​​​1.题目描述​​​​2.输入格式​​​​3.输出格式​​​​4.样例输入​​​​5.样例输出​​​​6.数据范围​​​​7.原题链接​​​​2.解题思路​......
  • 蓝桥杯嵌入式——输入捕获的补充
    输入捕获除了可以测量频率,也可以测量占空比配置 首先是定时器2的配置,通道一直接捕获,测量上升沿,通道二间接捕获,测量下降沿    定时器3同上编程(中断部分)这个程......