最新要闻
- 环球观热点:不调好不上市 moto X40驯服二代骁龙8:1小时王者温度仅42度
- Nature年度十大人物出炉:猪心移植手术团队负责人等入选
- 饱满如水滴!联想moto X40开箱图赏
- 5000mAh大电池+120Hz屏 899元联想moto G53图赏
- 109度大电池能跑730KM!岚图追光预售:32.29万元起
- 视焦点讯!努比亚Z50散热堆料离谱:散热总面积达到36462m㎡
- 中国光纤之父赵梓森逝世 享年91岁:拉出了我国第一根光纤
- 世界观热点:苹果妥协了!将开门迎接第三方应用商店 用户褒贬不一
- 杭州疑似有陨石掉落:一团火球 照亮夜空
- 《隐秘的角落》游戏来了:Steam版定档明年1月18日
- 【时快讯】可以薅羊毛了!网易云音乐TV版正式上线:免费送3个月会员
- 天天快报!男子花12万买世界杯彩票没中要求退款 理由气煞店老板
- 天天热头条丨微信全新朋友圈点赞互动广告上线:点下就能放烟花秀
- 天天热资讯!下单15分钟送到:上海开通首条美团无人机常态化航线
- 环球关注:IMDb 8.2分!《阿凡达2》口碑爆棚 影院回应票价高:消费者不缺钱缺服务
- OPPO Find N2 Flip外屏惊艳:支持快捷回复、锁屏小游戏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
热点评!分智慧果 - 2021算法与数据结构实验题
算法与数据结构实验题 8.19 分智慧果
题目内容
★实验任务
老师准备把一筐智慧果分给班上的同学,第i个同学(从1开始编号)分到 \(a_i\) 个智慧果。Bonez (编号为1)是个自私的人,如果他的智慧果数不是班上最多的(即存在某位同学的智慧果数大于他的智慧果数),他会悄悄把别的同学的智慧果放进自己的那堆里。请问他至少需要从其他同学那里拿多少个智慧果,才可以使自己的智慧果数是班上最多的?
【资料图】
★数据输入
第一行为正整数n; 第二行为n个正整数a[1..n]。\((0 \le a_i \le 10^5)\)
60%的数据 \(1 \le n \le 100\).
100%的数据 \(1 \le n\le 100000\)
★数据输出
输出最少需要从别处拿的智慧果数。
输入示例
31 8 0
输出示例
4
题目分析
\(n_1 : n_i \in U, \forall\ n_1 \ge n_i\) 换句话说, 就是要让 Bonez 的智慧果数量不少于任何一个同学.
这里我们给出一个例子.
若要让 Bonez 的智慧果数量最多, 那么遵循贪心的原则, 每一次我们都让智慧果数量最多的同学给 Bonez 一个智慧果.
这样看还是不太直观, 我们不妨按照智慧果数量排个序.
要使得 Bonez 的智慧果最多且操作次数最少, 我们则需要每次从智慧果最多的人那里拿出一个给 Bonez, 并且在该操作之后动态地维护智慧果序列. 直到 Bonez 成为智慧果数量最多的人. 操作的次数就是题目要求的答案.
在这个例子中, 我们不难看出, 算法的关键就是在于怎样每一次都可以快速的找到序列中最多智慧果的数量. 如何实现呢? 当然是优先队列.
算法实现
在这个例子当中, 我们需要高效的知道当前序列中最多的智慧果数量是多少. 而优先队列正好可以满足我们的这个要求.
优先队列可以实现 O(1) 的查找最值. 若算上维护的操作, 那么一次查询和分配智慧果就是 O(1 + nlog n) = O(nlog n).
对于具体的优先队列实现这里就不再赘述.
为查找序列中的最大值, 本题使用的是大根堆, 并且以数组存储近似满二叉堆的形式存储堆.
给出近似满二叉堆的相关接口, 后续堆的操作有用到.
int _Parent(int x) { return ((x - 1) >> 1); }int _LChild(int x) { return ((x << 1) + 1); }int _RChild(int x) { return ((x << 1) + 2); }
题目中主要用到的操作只有两个分别是: 插入 和 修改
insert()
我们没办法直接知道待插入元素在堆中的正确位置, 所以我们要通过这种间接的方式先插入再维护, 从而完成一次堆插入操作.
1/ 插入新元素至堆底
将新插入的元素插入到堆的最底层, 即数组的最后一个位置, 使其成为一片新的叶子.
2/ 调整元素位置, 保持堆的结构
然后再沿着新插入的这个节点, 向根回溯. 每一次回溯都去判断当前节点及其两个子节点是否满足大根堆的结构.
若否, 则更新堆, 交换不符合的两个节点的位置, 使得在这个子堆中仍然保持着堆的结构.
不断回溯, 直到到达堆的根. 完成一次插入操作.
void insert(int n){// 1. 插入新元素至堆底_heap[_size++] = n;// 2. 调整元素位置, 保持堆的结构int buf, scan = _size - 1;// scan 从堆底开始扫描; buf 是 scan 的父节点用来判断堆结构是否正确while ((buf = _Parent(scan)) >= 0)// 循环, 直到 scan 的父节点非零的时候退出{if (_heap[scan] < _heap[buf])// 堆结构已经正确, 退出循环.break;swap(_heap[scan], _heap[buf]);// 交换节点, 使其满足堆的结构scan = buf;// 更新 scan, 以继续向根节点迭代检查.}}
建树的过程就是不断地往优先队列中加入新的元素. 还是用上面提到的例子来演示, 如动图所示.
solve()
类似于插入操作的设计思想, 要对堆中的元素进行修改, 可以先直接修改, 然后再去维护堆.
1/ 分配智慧果
将堆中最大元素, 即堆顶元素减一, Bonez 的智慧果数量加一. 完成对智慧果数量的修改
2/ 调整元素位置, 保持堆的结构
整体的思想和流程和insert()的基本一致. 不同的是在插入的过程中维护是自底向上的, 而在这次维护的过程中调整是自顶向下的.
具体来说, 先判断修改后的堆是否还维持着堆的结构.
int solve(){int ret = 0;// 记录分配的次数, 即 Bonez 拿到的智慧果数量// 重分配智慧果while (_head < _heap[0])//循环, 直到 Bonez 的智慧果数量比堆中的最大元素还大{// 1. 进行一次智慧果分配_heap[0]--; _head++; ret++;// 2. 调整元素位置, 保持堆的结构// 自顶向下遍历检查// (这里的 buf 和之前的 buf 不同: buf 是 scan 中更大的子节点的下标)for (int scan = 0, buf = 1; buf < _size; buf = _LChild(scan)){// 找出子节点中更大的那个if (buf + 1 < _size && _heap[buf] < _heap[buf + 1]) // if (下标不越界 && 另一个子节点更大)buf++;if (_heap[scan] > _heap[buf])// 堆结构已经正确, 退出循环.break;swap(_heap[scan], _heap[buf]);// 交换节点, 使其满足堆的结构.scan = buf;// 更新 scan, 以继续向子节点迭代检查.}print();}
还是刚才的那个例子. 下面是在优先队列中的演示.
代码 codes
#include using namespace std;class BinaryHeap// 大根堆{int *_heap = nullptr;// 存储堆中的所有元素int _size = 0;// 堆中元素的数量int _capacity = 0;// 堆的最大容量int _head;// Bonez 的智慧果数量// 用数组实现近似满二叉堆的相关接口int _Parent(int x) { return ((x - 1) >> 1); }int _LChild(int x) { return ((x << 1) + 1); }int _RChild(int x) { return ((x << 1) + 2); }public:// 初始化BinaryHeap(int c = 100000) : _capacity(c) { _heap = new int[c + 100]; }void init(int h) { _head = h; }void insert(int n){// 1. 插入新元素至堆底_heap[_size++] = n;// 2. 调整元素位置, 保持堆的结构int buf, scan = _size - 1;// scan 从堆底开始扫描; buf 是 scan 的父节点用来判断堆结构是否正确while ((buf = _Parent(scan)) >= 0)// 循环, 直到 scan 的父节点非零的时候退出{if (_heap[scan] < _heap[buf])// 堆结构已经正确, 退出循环.break;swap(_heap[scan], _heap[buf]);// 交换节点, 使其满足堆的结构scan = buf;// 更新 scan, 以继续向根节点迭代检查.}}int solve(){int ret = 0;// 记录分配的次数, 即 Bonez 拿到的智慧果数量// 重分配智慧果while (_head < _heap[0])//循环, 直到 Bonez 的智慧果数量比堆中的最大元素还大{// 1. 进行一次智慧果分配_heap[0]--; _head++; ret++;// 2. 调整元素位置, 保持堆的结构// 自顶向下遍历检查// (这里的 buf 和之前的 buf 不同: buf 是 scan 中更大的子节点的下标)for (int scan = 0, buf = 1; buf < _size; buf = _LChild(scan)){// 找出子节点中更大的那个if (buf + 1 < _size && _heap[buf] < _heap[buf + 1]) // if (下标不越界 && 另一个子节点更大)buf++;if (_heap[scan] > _heap[buf])// 堆结构已经正确, 退出循环.break;swap(_heap[scan], _heap[buf]);// 交换节点, 使其满足堆的结构.scan = buf;// 更新 scan, 以继续向子节点迭代检查.}print();}return ret;}void print(){for (int i = 0, j = 1; i < _size; i++){if (i + 1 == j){putchar("\n");j *= 2;}printf("%d ", _heap[i]);}cout << endl;}};inline int read();int main(void){#ifdef LOCAL_COMPILEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifint numCount = read();BinaryHeap heap(numCount);heap.init(read());for (int i = 1; i < numCount; i++)heap.insert(read());cout << heap.solve();return 0;}inline int read(){int ret = 0, sign = 1;char ch = getchar();while (ch < "0" || ch > "9"){if (ch == "-")sign = -1;ch = getchar();}while (ch >= "0" && ch <= "9"){ret = (ret << 1) + (ret << 3) + (ch ^ 48);ch = getchar();}return ret * sign;}
热点评!分智慧果 - 2021算法与数据结构实验题
环球观热点:不调好不上市 moto X40驯服二代骁龙8:1小时王者温度仅42度
Nature年度十大人物出炉:猪心移植手术团队负责人等入选
饱满如水滴!联想moto X40开箱图赏
5000mAh大电池+120Hz屏 899元联想moto G53图赏
109度大电池能跑730KM!岚图追光预售:32.29万元起
天天微动态丨自研分布式高性能RPC框架及服务注册中心ApiRegistry实践笔记【原创】【开源】
【独家】图形用户界面(GUI)编程可以学习C++ Builder,多图、实例、书籍
17 Java内存模型与线程_Java与线程
视焦点讯!努比亚Z50散热堆料离谱:散热总面积达到36462m㎡
中国光纤之父赵梓森逝世 享年91岁:拉出了我国第一根光纤
世界观热点:苹果妥协了!将开门迎接第三方应用商店 用户褒贬不一
杭州疑似有陨石掉落:一团火球 照亮夜空
环球要闻:AIRIOT答疑第2期|如何使用物联网平台的数据采集与控制引擎?
《隐秘的角落》游戏来了:Steam版定档明年1月18日
【时快讯】可以薅羊毛了!网易云音乐TV版正式上线:免费送3个月会员
天天快报!男子花12万买世界杯彩票没中要求退款 理由气煞店老板
天天热头条丨微信全新朋友圈点赞互动广告上线:点下就能放烟花秀
天天热资讯!下单15分钟送到:上海开通首条美团无人机常态化航线
世界速读:BaseDet: 走过开发的弯路
今日热门!引迈信息荣登「2022低代码企业50强」:JNPF,你的不二选择!
环球关注:IMDb 8.2分!《阿凡达2》口碑爆棚 影院回应票价高:消费者不缺钱缺服务
OPPO Find N2 Flip外屏惊艳:支持快捷回复、锁屏小游戏
第二家通吃NVIDIA、AMD、Intel的显卡品牌诞生!这也太贵了
天天实时:公牛发布航天级品质超薄插座:可承受2万次拔插
环球微头条丨跌破零下40度!内蒙古出现极寒冰雾天气:冷到“冒白烟”
环球微速讯:SQL的使用总结
天天快资讯:WPF深入简出(一)入门必看
观热点:【机器学习】李宏毅——浅谈机器学习原理+鱼与熊掌兼得的深度学习简述
当前动态:前后端AES加密解密,CryptoJS和Java实现
热讯:记录--手把手带你开发一个uni-app日历插件(并发布)
OPPO Find N成为全国销量第二折叠屏!一经发布就大获成功
微速讯:首次使用钛合金螺丝!OPPO Find N2仅233g:折叠屏比iPhone还轻
OPPO Find N2内外一致好屏:双120Hz+双E6 可自由悬停
让玩家心动的定制 ROG 6游戏手机《暗黑破坏神:不朽》典藏限量版图赏
OPPO Find N2 233g比直板机还轻!央视点赞:刷新折叠屏手机新纪录
【世界速看料】LeetCode HOT 100:旋转图像
环球头条:特斯拉中国上线490元酒杯 限量卖 网友吐槽智商税
世界今日讯!女子连吃5天感冒药 多脏器功能衰竭:专家提醒小心这些症状
IT工程师哪里工资最高?美国仅排第二 第一收入超过70万
天天看热讯:帧数暴涨40%!《巫师3》次时代版画质优化指南
20万级大杀器 长安深蓝首款SUV曝光:增程、纯电全都有
【天天速看料】Shell 标准输入和输出
信息:公司新来一个同事,把网关系统设计的炉火纯青!(万能通用,稳的一批。。)
当前视讯!易基因|NSUN2介导RNA m5C修饰促进食管鳞状细胞癌进展的表观调控机制 | 肿瘤研究
ThingsBoard前端项目的安装与启动
【时快讯】RELIC库学习
全球看热讯:喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”
投影仪的工作原理是什么?投影仪排名前十的品牌
Centos安装Nginx
针孔无线摄像机怎么连接?针孔无线摄像机怎么用?
本地连接受限制或无连接是怎么回事?本地连接受限制或无连接怎么解决?
svchost.exe占用cpu过是什么原因?svchost.exe占用cpu过高解决方法
pdf文件打开是乱码怎么回事?pdf文件打开是乱码时该怎么办?
男主角是明星的小说有哪些?男主角是明星的小说推荐
科比最后一场比赛是什么时候?科比最后一场比赛是多少分?
鞋子防臭的小妙招有哪些?鞋子防臭喷雾哪个牌子好?
沙棘如何鉴别好坏?沙棘的功效作用与主治是什么?
玉碎了代表什么征兆?玉碎了有什么办法修复吗?
英雄联盟更新慢是什么原因?英雄联盟更新慢怎么办?
怎么才能加快迅雷的下载速度?加快迅雷下载速度的方法有哪些?
全球讯息:阻止Windows未知应用弹窗的一种思路方法
Zabbix6.0使用教程 (四)—zabbix6.0从源代码安装
Tomcat工作原理
小键盘指法是什么意思?小键盘指法包括什么键?
iphone13如何添加公交卡?iphone13添加公交卡的方法有哪些?
安卓系统的手机有哪些?安卓系统的手机有哪些牌子好?
天天快讯:针对某钓鱼网站的渗透测试
【脚本项目源码】Python制作桌面宠物,这么可爱的萌宠你不想拥有吗?
今日热议:4999元 小米13限量定制色明天首销:只有5万台
环球焦点!中国民营火箭朱雀二号发射失利 全球首型轨道飞行的甲烷火箭
当前播报:QQ邮箱推实用新功能:英文文档一键即可翻译
【报资讯】丰田凯美瑞看呆!新一代本田雅阁实车曝光:比思域还运动
撞到快报废!特斯拉高速追尾大货车 司机身亡:现场视频速度快到可怕
单手就能用的折叠屏旗舰!OPPO Find N2今天发布:比直板机还轻
环球视讯!反对无效!日本投放广告宣传福岛核污水安全性:必须排海
【环球播资讯】我国成功发射遥感三十六号卫星!长征火箭年发射数首次迈上50大关
【环球速看料】适合男女双打 这三款游戏拉近你和她的距离
焦点滚动:腾讯互动阅读App《一零零一》宣布将停运:补偿方案出炉
环球新动态:显卡不会便宜了?NV要发新RTX 4080、4090:移动版也万元节奏
世界新消息丨法国2-0摩洛哥 决赛战阿根廷!网友发现规律:姆巴佩进球就不会输
快消息!Vue核心概念与其指令
Wireshark使用笔记
焦点!Zabbix监控系统
世界快资讯丨Kubernetes Volumes 笔记
取代奔腾/赛扬!Intel 12代Alder Lake-N处理器来了:清一色小核、超低功耗
环球即时看!德国樱桃收购瑞典外设品牌Xtrfy:对方只有12人
当前信息:国六B汽油要全面上线了!听说这玩意又贵又不耐烧?
环球关注:Wi-Fi 7:明年下半年见
天天看点:App流畅度提升88%!小米承诺:所有升级MIUI 14机型均支持光子引擎
全球要闻:雷军:全面对标苹果iPhone 一个新的小米开始了
环球滚动:[WPF] MediaElement播放HDR视频泛黄、颜色显示不正确应该如何解决?
R数据分析:冲击流图与热图的做法以及多图布局
简讯:VUE简介
天天微头条丨意外之喜:苹果给iPhone 6s/7推送iOS 15.7.2系统更新
焦点精选!脱口秀演员直播带货:想得美好
直播:今年最后一场大型流星雨来了!双子座流星雨压轴登场
游戏性能被RX7900反超?《巫师3》次世代版4090光追演示
天天信息:摩托罗拉×潘通 “非凡洋红”限定版新机来了
Python3.7.3环境搭建