首页 > 其他分享 >「贪心&优先队列」数列极差

「贪心&优先队列」数列极差

时间:2023-01-06 12:34:07浏览次数:38  
标签:数列 int top pop 极差 num 贪心

本题为12月30日22寒假集训每日一题题解

题目来源:(未知)

题面

题目描述

佳佳的老师在黑板上写了一个由n个正整数组成的数列,要求佳佳进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数$ a * b + 1 \(,如此下去直至黑板上剩下一个数为止,在所有按这种操作方式最后得到的数中,最大的为max,最小的为 min, 则该数列的极差定义为\) M=max−min $。

由于佳佳忙于准备期末考试,现请你帮助他,对于给定的数列,计算出相应的极差M。

输入

第一行为一个正整数n表示正整数序列的长度;

在接下来的n行中,每行输入一个正整数。

接下来的一行有一个0,表示数据结束。

输出

输出只有一行,为相应的极差d。

样例输入

3
1
2
3
0

样例输出

2

提示

对于全部数据,0≤n≤50000,保证所有数据计算均在32位有符号整数范围内。


思路分析

凭直觉想到的贪心策略,目前还没看懂证明,日后再补.

参考代码

#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")

#include <iostream>
#include <queue>

using namespace std;
 
int main()
{
    ios::sync_with_stdio(false);
 
    int n;
    cin >> n;
 
    if (n <= 1)
    {
        cout << 0 << "\n";
        return 0;
    }
 
    priority_queue<int> a;
    priority_queue<int, vector<int>, greater<int>> b;
 
    for (int i = 0; i < n; i++)
    {
        int num;
        cin >> num;
        a.push(num);
        b.push(num);
    }
 
    int max, min;
 
    while (a.size() > 1)
    {
        int num = a.top();
        a.pop();
        num = num * a.top() + 1;
        a.pop();
        a.push(num);
    }
 
    while (b.size() > 1)
    {
        int num = b.top();
        b.pop();
        num = num * b.top() + 1;
        b.pop();
        b.push(num);
    }
 
    min = a.top();
    max = b.top();
 
    cout << max - min << "\n";
    return 0;
}

"正是我们每天反复做的事情,最终造就了我们,优秀不是一种行为,而是一种习惯" ---亚里士多德

标签:数列,int,top,pop,极差,num,贪心
From: https://www.cnblogs.com/geministar/p/zstu22_1_3.html

相关文章

  • java——等差素数数列
    题目描述2,3,5,7,11,13,.... 是素数序列。类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。上边的数列公差为 3030,长度为 ......
  • 记录一道贪心+差分的题目
    由于差分这个知识点经常会被本人忘记,可能是做的题目太少了没怎么碰到。。。因此记录一道贪心加上差分的题目。本题为第十三届蓝桥杯省赛C++C组题目:4655.重新排序具体思......
  • LOJ 数列分块入门 9 题解题报告
    LOJ数列分块入门9题解题报告\(\text{ByDaiRuiChen007}\)I.数列分块入门1题目大意\(\text{Link}\)维护一个长度为\(n\)的序列,支持区间加,单点查值思路分析简......
  • Least Prefix Sum(贪心)
    题目链接题目描述:Baltic,afamouschessplayerwhoisalsoamathematician,hasanarray\(a_1,a_2,…,a_n\),andhecanperformthefollowingoperationsevera......
  • 509. 斐波那契数列
    问题描述https://leetcode.cn/problems/fibonacci-number/description/解题思路最经典的递归问题,它的问题描述就是递归的。先考虑参数和返回值。参数就是n,返回值是fib(......
  • 1、尾递归及优化 ,例:斐波那契数列 2、递归转循环,蹦床函数
    1、函数调用自身,即为递归,在return时调用自身,即为尾递归;递归非常消耗内存,其原因是需要同时保存成成百上千的调用帧,这容易发生栈溢出错误;但是尾递归只存在一个调用帧,所以永......
  • 贪心算法Dijkstra
    Dijkstra最短路径问题:给定一个带权有向图G=(V,E,W),同时给定一个源点u(u∈V),我们要找出从源点u出发到其它各点的最短路径距离,并得出这些最短路径的具体路径......
  • 【排序贪心】【字符串】LeetCode 179. 最大数
    题目链接179.最大数思路转自宫水三叶大佬的题解对于nums中的任意两个值a和b,我们无法直接从常规角度上确定其大小/先后关系。但我们可以根据「结果」来决定a和......
  • 关于常系数齐次线性递推数列能被表示成等比数列线性和的证明
    退役OIer来诈尸了,祝大家新年快乐。问题引入下面的所有数列默认下标从\(0\)开始。对于一个数列\(\{a_n\}\),如果其满足\(k\)阶常系数齐次线性递推关系:\[a_n=\sum_{......