奥赛一本通 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;
}

浙公网安备 33010602011771号