砍竹子

# [蓝桥杯 2022 省 B] 砍竹子

## 题目描述

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

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

## 输入格式

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

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

## 输出格式

一个整数表示答案。

## 样例 #1

### 样例输入 #1

```
6
2 1 4 2 6 7
```

### 样例输出 #1

```
5
```

## 提示

**【样例说明】**

其中一种方案:

214267214262214222211222111222111111

共需要 5 步完成

**【评测用例规模与约定】**

对于 20% 的数据,保证 n1000,hi106

对于 100% 的数据,保证 n2×105,hi1018

蓝桥杯 2022 省赛 B 组 J 题。

 

//[蓝桥杯 2022 省 B] 砍竹子 //计算出所有竹子砍到还剩一下的次数,然后取最大值,只需要循环这个最大值 //由于是从最大值开始循环的,所以所有的次数都能被计算上 //如果此时你需要砍,接下来判断后面的竹子有没有和你等高的,然后砍去; #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10; int n,a[N],w[N],res,num; signed main() { cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; int tmp=a[i]; while(tmp-1) w[i]++,tmp=sqrt(tmp/2+1); num=max(num,w[i]); } for(int j=num;j>0;j--) for(int i=0;i<n;i++){ if(w[i]==j){ if(a[i]!=a[i+1]) res++; w[i]--,a[i]=sqrt(a[i]/2+1); } } cout<<res; return 0; }

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17592369.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
-- --
点击右上角即可分享
微信分享提示