砍竹子(蓝桥杯 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;
}


目录
相关文章
|
1月前
|
人工智能 C++
第十四届省赛大学B组(C/C++)接龙数列
第十四届省赛大学B组(C/C++)接龙数列
|
4月前
【天梯赛】L1-095 分寝室
输出的方案对应女生都是 24/4=6 人间、男生都是 60/6=10 人间,人数差为 4。满足前三项要求的分配方案还有两种,即女生 6 间(都是 4 人间)、男生 4 间(都是 15 人间);同时,每间女寝人数必须都一样,每间男寝人数必须都一样,也就是女生总人数对女寝数取模为0,男生总人数对男寝数取模为0。输入在一行中给出 3 个正整数 n0​、n1​、n,分别对应女生人数、男生人数、寝室数。按题意模拟,因为知道总寝室数为n,所以可以从1~n-1暴力枚举女寝 i 的数量,那么男寝的数量则为 c-i。
62 6
|
6月前
|
测试技术 C语言
第十四届蓝桥杯B组第一期模拟题
第十四届蓝桥杯B组第一期模拟题
51 0
|
算法 测试技术 C++
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解(二)
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解
149 0
|
算法 测试技术 C++
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解(一)
第十一届蓝桥杯第三场软件类省赛 C++ B组 题解
|
人工智能 Java 测试技术
试题 历届真题 完全二叉树的权值【第十届】【省赛】【A组】
试题 历届真题 完全二叉树的权值【第十届】【省赛】【A组】
|
算法 C++ Windows
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
166 0
省赛将至,咱们看看第十一届蓝桥杯省赛C/C++ B组试题都出了些什么了?知己知彼,百战不殆
|
算法
每日一题冲刺大厂提高组 第二十四天 胖胖的奶牛
大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!
88 0
下一篇
无影云桌面