当前位置: 首页 > 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.dtcms.com/a/335014.html

相关文章:

  • 【深度学习】基于ESRNet模型的图像超分辨率训练
  • pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)
  • ClaudeCode使用指南
  • 鲁老师深度学习笔记(1)—最大似然估计
  • Flutter Provider 模式实现:基于 InheritedWidget 的状态管理实现
  • 93、23种设计模式之抽象工厂模式
  • 【读论文】医疗AI大模型:百川开源Baichuan-M2
  • 23. CommonJS 和 ES6 Module 区别
  • 19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战
  • ArrayList的contains问题
  • 【C++学习篇】:基础
  • Markdown 生成 Gantt 甘特图
  • STM32硬件SPI配置为全双工模式下不要单独使用HAL_SPI_Transmit API及HAL_SPI_TransmitReceive改造方法
  • 【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
  • 人工智能之数学基础:条件独立
  • AI提升SEO关键词搜索效果
  • UDP/TCP套接字编程简单实战指南
  • 数据结构 栈与队列
  • Tomcat配置文件深度解析
  • [安洵杯 2019]Attack
  • STM32F407VET6开发板标准库实现DMA空闲接收和发送
  • 同创物流学习记录2·电车光电
  • 行为型设计模式:对象协作的舞蹈家(中)
  • Rust 入门 KV存储HashMap (十七)
  • 如何得知是Counter.razor通过HTTP回调处理的还是WASM处理的,怎么检测?
  • LeetCode 55.跳跃游戏:贪心策略下的可达性判断
  • 2025年睿抗国赛本科组题解
  • JavaScript 数组方法汇总
  • 第四章 数字特征
  • 数智管理学(四十七)