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

简介: 砍竹子(蓝桥杯 2022 省赛 B 组 J 题)

AC代码:

#include<iostream>
#include<queue>
#include<math.h>
using namespace std;
long long res;
struct node
{
  long long val,l, r;
};
bool operator <(node a, node b)
{
  return a.val == b.val ? a.l < b.l : a.val < b.val;//定义调堆的规则,如果值相等的情况下,优先考虑左区间大的
}
int main(void)
{
  long long n, k;
  priority_queue<node>p;//定义一个node类型的堆
  scanf("%lld", &n);
  for (int i = 1; i <= n; i++)
  {
    scanf("%lld", &k);
    p.push({ k,i,i });
  }
  while (p.top().val != 1)
  {
    node t = p.top();//取出当前的堆顶元素(最大值)
    p.pop();//先将最大值出堆,等砍掉之后还会将高度重新入堆
    node top;//用于等会记录堆中第二大的值
    while (!p.empty())
    {
      top = p.top();//堆中第二大的值
      if (t.val == top.val && t.l - 1 == top.r)//如果最大值和第二大的值相等,并且区间差只有1,就是相邻的竹子
      {
        p.pop();//一起砍掉,就是先pop掉第二大的,所有相等的且相邻的只用保留一个数就行了,当这个数被砍为1的时候相当于所有相邻的都被砍为1了
        t.l = top.l;//相当于合并区间了
      }
      else
      {
        break;//如果没有可以一并砍掉的就直接跳出循环
      }
    }
    int val = sqrtl(t.val / 2 + 1);//计算
    p.push({ val,t.l,t.r });//将砍了之后的高度加入堆中
    res++;//砍的次数+1
  }
  printf("%lld", res);
  return 0;
}


目录
相关文章
|
2月前
|
人工智能 C++
第十四届省赛大学B组(C/C++)接龙数列
第十四届省赛大学B组(C/C++)接龙数列
|
7月前
|
测试技术 C语言
第十四届蓝桥杯B组第一期模拟题
第十四届蓝桥杯B组第一期模拟题
53 0
|
算法 测试技术 C++
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解(一)
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解
106 0
|
算法 测试技术 C++
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解(二)
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解
156 0
|
C++
第四届蓝桥杯省赛 C++ B组 - 翻硬币
第四届蓝桥杯省赛 C++ B组 - 翻硬币
79 0
|
开发工具
贤鱼的刷题日常-P1021 [NOIP1999 提高组] 邮票面值设计-题目详解
🍀学习了解P1021 [NOIP1999 提高组] 邮票面值设计
118 0
贤鱼的刷题日常-P1021 [NOIP1999 提高组] 邮票面值设计-题目详解
|
算法 C++ Windows
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
170 0
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
|
算法
每日一题冲刺大厂提高组 第二十四天 胖胖的奶牛
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
93 0