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