zoukankan      html  css  js  c++  java
  • 数列极差问题-STL优先队列-贪心

    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 <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    priority_queue<int> qmax;
    priority_queue<int,vector<int>, greater<int> > 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<n;++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
    ",qmin.top()-qmax.top());
    	return 0;
    }
    
  • 相关阅读:
    Codeforces Round #313 (Div. 1) A.Gerald's Hexagon
    COJN 0585 800604鸡蛋的硬度
    COJN 0584 800603吃糖果
    COJN 0583 800602分苹果
    COJN 0575 800601滑雪
    昨天的补记
    重构的代码
    写了一个复杂的sql语句
    一个想法
    安装了C
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13335657.html
Copyright © 2011-2022 走看看