当前位置: 首页 > news >正文

1083. 数列极差问题

题目描述

在黑板上写了NNN个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数 ab ,然后在数列中加入一个数a×b+1a \times b+1a×b1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为 maxmaxmax,最小的为 minminmin , 则该数列的极差定义为 M=max-minM=max-minMmaxmin
请你编程,对于给定的数列,计算极差 mmm

输入

第一行是数列的长度n(不超过10),第二行起是数列中n个数,相邻2个数由空格分开;
每个数均不超过100.

输出

输出一个整数表示数列极差m

样例输入

3
1  2  3

样例输出

2

思路

题目中有这个东西: 每次 擦去 其中的两个数 aaabbb,然后在数列中加入一个数 a×b+1a \times b+1a×b1

这不就是哈夫曼编码的建立过程吗? 所以我们根据贪心策略,当然每次选择最小的整数相乘自然会更好呀?

什么? 你想要证明?这个和哈夫曼编码的证明的方法是一样的,最好的方法当然是上网搜索啦 (其实太复杂了,作者不会qwq)

Step1: 定义堆

priority_queue<int> q1;
priority_queue<int, vector<int>, greater<int>> q2;

q1 里面的元素是越大的在前面,q2 就是越小的在前面
注意: q2的定义后面的两个 “>>” 符号在编译的时候要使用 C++11 编译,要使用 C++11 提交,如果不想这样,可以加一个空格,比如:

priority_queue<int, vector<int>, greater<int> > q2;

Step2: 主程序计算

int Max = 0, Min = 0;
while (q1.size() > 1)
{int p = q1.top(); q1.pop();int q = q1.top(); q1.pop();	q1.push(p * q + 1);
}
Min = q1.top();while (q2.size() > 1)
{int p = q2.top(); q2.pop();int q = q2.top(); q2.pop();q2.push(p * q + 1);
}
Max = q2.top();printf("%d", Max - Min);

push: 表示将元素 i 插入堆
pop: 表示删除最大/最小的元素
top: 表示取最大的元素

Step3: 完整代码

#include <stdio.h>
#include <queue>using namespace std;int n;
priority_queue<int> q1;
priority_queue<int, vector<int>, greater<int>> q2;
int main()
{int n;scanf("%d", &n);for (int i = 1; i <= n; i++){int x;scanf("%d", &x);q1.push(x), q2.push(x);}int Max = 0, Min = 0;while (q1.size() > 1){int p = q1.top(); q1.pop();int q = q1.top(); q1.pop();q1.push(p * q + 1);}Min = q1.top();while (q2.size() > 1){int p = q2.top(); q2.pop();int q = q2.top(); q2.pop();q2.push(p * q + 1);}Max = q2.top();printf("%d", Max - Min);return 0;
}

时间复杂度分析

堆的 pushO(log⁡n)O(\log n)O(logn) 的,但是这道题的数列的长度是 101010, 完全足够
运行时间只有 0.1s0.1s0.1s, 因为机器的每秒钟运算大概是 10810^8108, 0.1s0.1s0.1s 大约就是 10710^7107 左右,那么这个程序的时间复杂度是 O(nlog⁡n)O(n \log n)O(nlogn) 在最大规模是 101010 的情况下大约要进行 303030 次运算(太快了,oj 上跑出了 0ms0 ms0ms)

http://www.lryc.cn/news/622664.html

相关文章:

  • 2025暑期—10ROS系统实现-计算图
  • Linux sar命令详细使用指南
  • 【CV 目标检测】Fast RCNN模型①——与R-CNN区别
  • 【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-用户管理
  • 基于Python的课程作业管理系统 Python+Django+Vue.js
  • .net印刷线路板进销存PCB材料ERP财务软件库存贸易生产企业管理系统
  • 《Python 单例模式(Singleton)深度解析:从实现技巧到争议与最佳实践》
  • pytest tmpdir fixture介绍(tmpdir_factory)(自动在测试开始前创建一个临时目录,并在测试结束后删除该目录)
  • C#单元测试(xUnit + Moq + coverlet.collector)
  • STM32 软件I2C读写MPU6050
  • 云服务平台主流架构的相关知识体系剖析
  • 完整设计 之 智能合约系统:主题约定、代理协议和智能合约 (临时命名)----PromptPilot (助手)答问之2
  • 智能合约:区块链时代的“数字契约革命”
  • C++ STL-string类底层实现
  • 《WebPages 数据库:构建高效网络信息管理平台的关键技术解析》
  • RK3568 NPU RKNN(四):RKNN-ToolKit2性能和内存评估
  • Vue3从入门到精通:5.2 Vue3构建工具与性能优化深度解析
  • 微软Wasm学习-创建一个最简单的c#WebAssembly测试工程
  • PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
  • 【C 学习】06-算法程序设计举例
  • [1Prompt1Story] 注意力机制增强 IPCA | 去噪神经网络 UNet | U型架构分步去噪
  • 智慧景区导览系统:基于WebGL的手绘地图导览设计与应用,DeepSeek大模型赋能精准游客引导服务
  • OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数
  • eChart饼环pie中间显示总数_2个以上0值不挤掉
  • VS Code配置MinGW64编译非线性优化库NLopt
  • AI云电脑盒子技术分析——从“盒子”到“算力云边缘节点”的跃迁
  • JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页”
  • 面试问题详解一:什么是 Qt?
  • 数字分类:机器学习经典案例解析