2040: [蓝桥杯2022初赛] 砍竹子(优先队列)
2040: [蓝桥杯2022初赛] 砍竹子
内存限制:256 MB 时间限制:1 S 标准输入输出
题目类型:传统 评测方式:文本比较 上传者:外部导入
提交:137 通过:60
题目描述
这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的高度为 hi.
他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。
魔法可以对连续的一段相同高度的竹子使用,假设这一段竹子的高度为H,
那么使用一次魔法可以把这一段竹子的高度都变为:
其中 ⌊x⌋ 表示对 x 向下取整。
小明想知道他最少使用多少次魔法可以让所有的竹子的高度都变为1。
输入格式
第一行为一个正整数 n,表示竹子的棵数。
第二行共 n 个空格分开的正整数 hi,表示每棵竹子的高度。
20%的测试数据:n ≤ 1000; hi ≤ 10^6。
100%的测试数据:n ≤ 2 × 10^5; hi ≤ 10^18。
输出格式
一个整数表示答案。
输入样例 复制
6
2 1 4 2 6 7
输出样例 复制
5
数据范围与提示
其中一种方案:
2 1 4 2 6 7
→ 2 1 4 2 6 2
→ 2 1 4 2 2 2
→ 2 1 1 2 2 2
→ 1 1 1 2 2 2
→ 1 1 1 1 1 1
共需要 5 步完成。
1)结构体实现的优先队列
/**1)结构体实现的优先队列
*/
/**
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <functional>
using namespace std;
typedef long long LL;//可以在定义结构体(类)的时候就重载运算符,当然当重载的运算符是成员函数时,成员函数
//的(显示)参数数量比运算对象的数量少一个,this绑定到左侧运算对象;
//当不是成员函数的时候,要定义成友元函数,即在函数前加关键字 friend ,此时友元函数的参数
//和一般函数的数量一样struct infor
{LL val;int pos;
// friend bool operator < (const infor &a,const infor &b) //非成员函数需要将其定义成友元函数函数
// {
// if(a.val!=b.val)
// return a.val<b.val;
// else
// return a.pos<b.pos;
// }
};struct cmp
{bool operator () (const infor &a,const infor &b){if(a.val!=b.val)return a.val<b.val;elsereturn a.pos<b.pos;}
};int main()
{int n;infor val;// priority_queue<infor> vec;priority_queue<infor,vector<infor> ,cmp> vec;scanf("%d",&n);for(int i=0;i<n;++i){scanf("%lld",&val.val);val.pos=i;vec.push(val);}int sum=0;while(vec.top().val!=1){infor top=vec.top();vec.pop();LL ans=floor(sqrt((top.val/2+1)*1.0));vec.push({ans,top.pos});int coun=1;while(vec.top().val==top.val&&vec.top().pos==top.pos-coun++){infor temp=vec.top();vec.pop();vec.push({ans,temp.pos});}++sum;}cout << sum << endl;return 0;
}
*/
2) pair 容器实现的优先队列
优先队列的优先级默认设置为数字大的优先级高
/**2) pair 容器实现的优先队列优先队列的优先级默认设置为数字大的优先级高
*/
/**
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef pair<long long ,int> pll;int main()
{int n;pll val;priority_queue<pll> vec;scanf("%d",&n);for(int i=0;i<n;++i){scanf("%lld",&val.first);val.second=i;if(val.first!=1)vec.push(val);}int sum=0;while(!vec.empty()&&vec.top().first!=1){pll top=vec.top();vec.pop();long long ans=floor(sqrt((top.first/2+1)*1.0));if(ans!=1)vec.push({ans,top.second});int coun=1;while(!vec.empty()&&vec.top().first==top.first&&vec.top().second==top.second-coun++){pll temp=vec.top();vec.pop();if(ans!=1)vec.push({ans,temp.second});}++sum;}cout << sum << endl;return 0;
}*/
3) 先把一棵树砍掉所需要的次数累加起来,然后再减掉相邻相等的树;
把每棵树每次砍掉之前的高度记录下来,由于是200000棵树,1e18高度的树
砍到1的次数为6,因此可以开一个dp[500010][6]的数组来存储数据。
/**3) 先把一棵树砍掉所需要的次数累加起来,然后再减掉相邻相等的树;把每棵树每次砍掉之前的高度记录下来,由于是200000棵树,1e18高度的树砍到1的次数为6,因此可以开一个dp[500010][6]的数组来存储数据。
*/#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn=200010,m=10;
LL dp[maxn][m];int main()
{int n;scanf("%d",&n);LL sta[m],val,res=0;int ans=0;for(int i=0;i<n;++i){int top=0;scanf("%lld",&val);while(val>1) sta[++top]=val,val=sqrt(val/2+1);ans=max(ans,top);res+=top;for(int j=0;top>0;++j,--top)dp[i][j]=sta[top];}for(int i=0;i<ans;++i)for(int j=0;j<n-1;++j){if(dp[j][i]&&dp[j][i]==dp[j+1][i]) //为什么此处只需要判断dp[j][i]>=1便可,因为dp[j][[i]res--; //最小的值都是2}cout << res << endl;return 0;
}
2040: [蓝桥杯2022初赛] 砍竹子(优先队列)相关推荐
- [蓝桥杯2022初赛] 砍竹子
题目描述 这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的高度为 hi. 他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子. 魔法可以对连续的一段相同高度的竹子使用,假设这一段竹子 ...
- 2032: [蓝桥杯2022初赛] 顺子日期
2032: [蓝桥杯2022初赛] 顺子日期 内存限制:256 MB 时间限制:1 S 标准输入输出 题目类型:传统 评测方式:文本比较 上传者:外部导入 提交:384 通过:153 题目描述 小明特 ...
- 2022蓝桥杯省赛——砍竹子
问题描述 这天, 小明在砍竹子, 他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的 高度为 hi. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子.魔法可以对连续的一 段相同高度的竹子使用, 假 ...
- 蓝桥杯 - 试题 J: 砍竹子(双向链表+堆/思维)
题目大意:给出一排 nnn 个竹子的高度,每次操作可以选择连续的,高度相同的竹子,使其高度变为 ⌊⌊H2+1⌋⌋\lfloor \sqrt{\lfloor \frac{H}{2}+1\rfloor} ...
- 蓝桥杯2022砍竹子
P2040 - [蓝桥杯2022初赛] 砍竹子 - New Online Judgehttp://oj.ecustacm.cn/problem.php?id=2040 #include <bit ...
- 【洛谷】P8787 [蓝桥杯 2022 省 B] 砍竹子 的题解
[洛谷]P8787 [蓝桥杯 2022 省 B] 砍竹子 的题解 题目传送门 思路 这个题有两个做法,一种是用 set 或者堆来维护一个高度到区间的映射,另一个用并查集维护区间. 这个题本质是一个最长 ...
- [蓝桥杯 2022 省 B] 砍竹子
来源: [蓝桥杯 2022 省 B] 砍竹子 题目描述 这天,小明在砍竹子,他面前有 n n n 棵竹子排成一排,一开始第 i i i 棵竹子的高度为 h i h_{i} hi. 他觉得一棵一棵砍太 ...
- 蓝桥杯2022年B组初赛题解C++(待完善)
文章目录 蓝桥杯2022年B组初赛题解C++ A题:九进制转十进制 B题:顺子日期 C题:刷题统计 D题:修剪灌木 E题:X进制减法 F题:统计子矩阵 G题:积木画 H题:扫雷 I题:李白打酒加酒加强 ...
- [蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组
解题思路: 这题如果我们考虑蚱蜢跳,有很多蚱蜢,有很多情况,所以我们让空盘跳,这样就简化题目了,然后我们化圆为直,将题目的情况看成字符串012345678,最后要变成087654321,这样题目就变得 ...
- 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)
蓝桥杯 2022年省赛真题(Java 大学C组) 目录 试题 A: 排列字母 试题 B: 特殊时间 试题 C: 纸张尺寸 试题 D: 求和 试题 E: 矩形拼接 试题 F: 选数异或 试题 G: GC ...
最新文章
- SAP 系统中STO+VC 技术实现
- glut64位操作系统安装
- 专访阿里云萧少聪、曹龙:一家云厂商对入局数据库做了哪些思考?
- V3S拍照上传又拍云bug排查过程
- 计算机网络的寻址问题ARP协议(Mac地址 ip地址)
- 从微盟删库事件谈数据修复的技术原理与时效挑战
- Swagger2-注解说明
- c语言双向循环链表合并,双向循环链表的合并
- linux制作xp u盘启动盘,ultraiso制作u盘启动盘linuxu大侠u盘装xp
- C语言简单游戏编程入门之四子棋
- 安阳工学院计算机学院考研,2019年考研,机械工程学院的同学们交出了这份成绩单……...
- erc20根据合约地址获取所有交易记录
- 西瓜创客和核桃编程之间,哪个更靠谱?西瓜创客一年学费多少?
- 【chrome】Chrome源码剖析、上--多线程模型、进程通信、进程模型
- VulnHub渗透测试实战靶场笔记(持续更新)
- 【JavaScript案例】js实现键盘敲击奏响音符
- Javascript二维码生成器,使用手机扫一扫二维码打开
- iOS11正式版亮点
- Python膨胀操作
- linux锐速命令,服务器优化-锐速ServerSpeeder命令说明
热门文章
- 计算机出现蓝屏怎么恢复,重启电脑后出现蓝屏怎么办
- bugku上disordered_zip
- 推荐一些经典网络小说及对网络文学和网络市场的一些个人看法
- C++解题报告:连续的“包含”子串长度——(线段树+尺取法)
- 2013、2014 U.S.NEWS美国大学排名榜
- deepin linux 安装 磁盘管理,在微软Windows系统上编辑深度Deepin Linux系统的磁盘
- eclipse豆沙绿设置(一些其他的编辑器也变成豆沙绿)
- 渗透之——使用Metasploit实现基于SEH的缓冲区溢出攻击
- 从冬奥看中国科技(六):千里光伏初长成
- 基于微信小程序的在线考试系统【毕业设计源码】