【贪心】信息奥赛一本通 1427:数列极差

该博客介绍了一种解决数列极差问题的方法,通过贪心策略利用堆(大顶堆和小顶堆)来求解。在每次操作中,先擦除最大和最小的两个数,然后生成新的数并重新插入堆中。最终输出堆中最大值与最小值的差即为极差。代码示例展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

      

【题目描述】

在黑板上写了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;
}

萌新发贴,水平有限,略显粗糙;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值