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

编程入门 行业动态 更新时间:2024-10-09 15:24:21

砍<a href=https://www.elefans.com/category/jswz/34/1638713.html style=竹子(蓝桥杯 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;
}

更多推荐

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

本文发布于:2024-03-08 11:16:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720717.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:竹子   蓝桥杯   省赛

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!