【题目描述】在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b ,然后在数列中加入一个数a×b+1 ,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max ,最小的为min ,则该数列的极差定义为M=max−min 。 |
【输出】输出极差。 |
【输入样例】3 1 2 3 |
【输入】第一行,一个数为N ; 第二行,N 个数。 |
【思路】:这是一道比较基础的贪心题,因为有累乘所以要求得最小值时应先将较大的数擦去;反之取最大值时应先将较小数擦去。因为新生成的数也需要进行排序,所以我选择堆进行。
【代码】
#include<bits/stdc++.h>
using namespace std;
int n,a[10001],max1,min1;
int main()
{
priority_queue<int> q2;//大顶堆
priority_queue<int, vector<int>, greater<int> > q1;//小顶堆
int i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
q1.push(a[i]);
q2.push(a[i]); //将数据插入堆中
}
for(i=1;i<=n-1;i++)
{
max1=q2.top(); //将最大值取出
min1=q1.top(); //将最小值取出
q2.pop(); //删除最大值
q1.pop(); //删除最小值
max1=max1*q2.top()+1;
min1=min1*q1.top()+1; //最大(最小)与次大(次小)相乘求出新数
q2.pop(); //删除次大值
q1.pop(); //删除次小值
q1.push(min1);
q2.push(max1); //插入新数
}
cout<<min1-max1;
return 0;
}
萌新发贴,水平有限,略显粗糙;