Description
在黑板上写了N个正整数组成的一个数列,进行如下操作: 每次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上 剩下一个数,在所有按这种操作方式最后得到的数中,最大的为max,最小的为min, 则该数列的极差定义为M=max-min。
请你编程,对于给定的数列,计算极差。
Input
第一个数N表示 正整数序列长度(0<=N<=50000),随后是N个正整数。
Output
计算极差
Sample Input
3
1
2
3
Sample Output
2
思路
多试几次发现规律/贪心策略:先合并小数得到最大值;先合并大数得到最小值。
代码
#include
#include
#include
using namespace std;
priority_queue qmax;
priority_queue, greater > qmin;
int n,a[50005];
int main()
{
scanf("%d",&n);
for(int i=1,temp;i<=n;++i) scanf("%d",&temp),qmax.push(temp),qmin.push(temp);
for(int i=1;i
{
int maxx=qmax.top(); qmax.pop(); maxx*=qmax.top(); qmax.pop(); qmax.push(maxx+1);
int minn=qmin.top(); qmin.pop(); minn*=qmin.top(); qmin.pop(); qmin.push(minn+1);
}
printf("%d\n",qmin.top()-qmax.top());
return 0;
}