欲張り——数列が極めて悪い

1600 ワード

問題F:数列が極端に悪い
時間制限: 1 Sec  メモリの制限: 128 MBコミット: 9  解決: 5[提出][状態][討論版][命題者:add_zmx]
タイトルの説明
黒板にN個の正の整数からなる数列を書いて、その中の2個の数aとbを消去するたびに、数列に1個の数aを加える.×b+1、このまま黒板に1つの数が残るまで、このような操作で最後に得られたすべての数のうち、最大はmax、最小はminであり、この数列の極差はM=max-minと定義される.
プログラミングしてください.与えられた数列に対して、計算が極めて悪いです.
入力
第1の動作の1つの数Nは正の整数シーケンス長(0<=N<=50000)を表す
第2の挙動N個の正の整数.
 
しゅつりょく
出力ファイルは1行のみで、対応する極差d
サンプル入力
 3 
1 2 3 

サンプル出力
2

テーマ解析:
MAXを求めます:毎回2つの最小の数を選びます
MINを求めます:毎回2つの最大の数を選びます
計算のたびに並べ替えられるので、優先キューで解くか、挿入ソートで解くことができます.
優先キューは1つの数を入れるたびに自動的にソートされます
priority_queue ,less > p;//大きいから小さいまで
priority_queue ,greater > q;//小さい頃から
#include
#include
#include
#include
#include
using namespace std;
int n,a[50005],maxnum=0,minnum=0,ans,x,y,d;
int main()
{
    cin>>n;
    priority_queue,greater >q1;
    priority_queue,less >q2;
   for(int i=0;i>a[i];
        q1.push(a[i]);
        q2.push(a[i]);
    }
    while(q1.size()!=1)//       >1,      x,y
    {
      x=q1.top();
      q1.pop();
      y=q1.top();
      q1.pop();
      q1.push(x*y+1);//x*y+1  
    }
    maxnum=q1.top();
    while(q2.size()!=1)//       >1,      x,y
    {
      x=q2.top();
      q2.pop();
      y=q2.top();
      q2.pop();
      q2.push(x*y+1);//x*y+1  
    }
    minnum=q2.top();
    d=maxnum-minnum;
    cout<