1427:数列极差

1427数列极差

 

[题解]

本题我是用优先队列做的QWQ

说说思路吧

 

这是一道贪心题

我们有一组数字

每次去掉两个 x , y,再加入一个新的 x*y+1

 

        如果保证最后得到一个最大的数字,那么每次去掉两个最小的数字,换来一个较大的数字(这样最后结果会越来越大)

        如果保证最后得到一个最小的数字,那么每次去掉两个最大的数字,换来一个新数字(由于你去掉了两个最大的数字,那么在最后你就失去了乘最大数让结果最大的机会,所以这个操作过程使得结果呈现递减趋势,结果就最小啦)

 

[代码]

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<functional>

using namespace std;

int n,maxn,minn,shu,x,y,ac[10001];
priority_queue<int,vector<int> ,greater<int> > a;
priority_queue<int> b; 

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&ac[i]);
    
    for(int i=1;i<=n;i++)
        a.push(ac[i]);  
    for(int i=1;i<=n;i++)
        b.push(ac[i]);
    
    for(int i=1;i<=n-1;i++)
    {
        x=a.top();
        a.pop();
        y=a.top();
        a.pop();
        a.push(x*y+1);
        
    }
    maxn=a.top();
    
    for(int i=1;i<=n-1;i++)
    {
        x=b.top();
        b.pop();
        y=b.top();
        b.pop();
        b.push(x*y+1);
    }
    minn=b.top();
  
    printf("%d",maxn-minn);
    
    return 0;
}

 

转载于:https://www.cnblogs.com/xiaoyezi-wink/p/10988008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值