蓝桥杯2117砍竹子(简单易懂 包看包会版)

问题描述

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

他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为 H, 那么

用一次魔法可以 把这一段竹子的高度都变为 ⌊H2⌋+1⌋, 其中 ⌊x⌋ 表示对 x 向下取整。小明想 知道他最少使用多少次魔法可

让所有的竹子的高度都变为 1 。

输入格式

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

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

输出格式

一个整数表示答案。

样例输入

复制代码
6
2 1 4 2 6 7

样例输出

复制代码
5

样例说明

其中一种方案:

214262: 214267→214262→214222→211222→111222→111111​ ​共需要 5 步完成

评测用例规模与约定

对于 20% 的数据, 保证 n≤1000,hi≤106 。 对于 100%的数据, 保证 n≤2×105,hi≤1018 。

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 256M

解题思路

这是一道不需要思考思维 要求实现细节的贪心思维题目

首先 易得一个贪心策略:优先砍所剩竹子中高度最大的竹子 砍完高度高的竹子后由于高度变低,所以可能会跟原来高度低的竹子一块被砍 所以策略后半部分为 尽可能制造出多的高度相同的连续竹子 然后一起砍

实现细节:会卡sqrt的精度 只能过65%的数据

每次利用堆取出 并记录下最高竹子的长度和编号 之后利用长度相同 编号相邻的竹子一起砍一次的策略 只砍一次 依次入堆

AC代码展示

如果觉得有用 就点赞+收藏 关注一下吧

cpp 复制代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<LL,int> PLI;
const int N=2e5+10;
int n;
LL x,res;
priority_queue<PLI> q;

void solve(){
	while(!q.empty()){
		PLI t=q.top(); q.pop();
		LL t1=t.first; int t2=t.second;
		
		LL high=sqrtl(t1/2+1); //砍竹子
		//注意:此题会卡sqrt的精度 要用sqrtl 返回long double
		if(high!=1) q.push({high,t2});
		
		//其实也可以理解为 对连续且长度相同的树的一列 就一起砍了 减少次数
		while(!q.empty()&&q.top().first==t1&&q.top().second==t2-1){
			t2--;
			q.pop();
			if(high!=1) q.push({high,t2}); 
			//注意 放的时候 竹子的高度是砍过的 
		}
		res++; //出现高度不同或编号不连续 即不能连续砍时 就++一次 每次取出一颗树 最后就会砍一次 只不过贪心一下是否可以一次多砍几棵树 
	}
}

int main(){
	IOS;
  	cin>>n;
  	for(int i=0;i<n;i++){
  		cin>>x;
  		if(x!=1) q.push({x,i});
	} 
	solve();
  	cout<<res<<endl; 
  	return 0;
}
相关推荐
m0_7202450115 小时前
1543.统计好三元组(简单)
开发语言·算法
To_OC15 小时前
LC 560 和为 K 的子数组:前缀和配哈希表,这对组合我是真的服了
javascript·算法·程序员
hans汉斯16 小时前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
叠层归一研究院16 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
其美杰布-富贵-李17 小时前
08 进阶评估指标与算法特定指标
人工智能·算法
.道阻且长.18 小时前
5.LeetCode算法习题讲解--双指针--有效三角形的个数
算法·leetcode·职场和发展
我是海飞18 小时前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
wabs66619 小时前
关于图论【最短路径之Bellman_ford 算法(单源有限最短路)|卡码网96.城市间货物运输III的思考】
数据结构·算法·图论·卡码网·bellman_ford·单源有限最短路
会周易的程序员20 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
lsylalalala21 小时前
常见的排序算法1
数据结构·算法·排序算法