奥赛一本通 1427 数列极差

1427 数列极差

题目大意

给定 $n$ 个正整数,每次选择两个数 $a, b$ 合并为 $a \times b + 1$,直到最终剩下一个数,求最终这个数的最大值与最小值之差。

知识要点

贪心、堆

解题思路

假设每次都将两个数合并为 $a \times b$,显然最终的结果与合并顺序无关。而合并为 $a \times b + 1$ 时,如果下一次与它合并的数是 $c$,那么合并结果就是 $a \times b \times c + c + 1$,也就是后参与合并的数会以加法的形式出现在结果之中,那么求最大值就应该先合并较小的数,求最小值就应该先合并较大的数,使用堆即可完成。

参考代码

#include <bits/stdc++.h>
using namespace std;

priority_queue<int> Q;
priority_queue<int, vector<int>, greater<int>> q;
int main() {
    int n, x, a, b;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &x);
        Q.push(x), q.push(x);
    }

    for(int i = 1; i < n; i++) {
        a = Q.top(), Q.pop();
        b = Q.top(), Q.pop();
        Q.push(a * b + 1);
        a = q.top(), q.pop();
        b = q.top(), q.pop();
        q.push(a * b + 1);
    }
    printf("%d\n", q.top() - Q.top());
    return 0;
}
posted @ 2026-09-01 10:41  萧西待水  阅读(6)  评论(0)    收藏  举报