欲張り——数列が極めて悪い
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
サンプル入力
サンプル出力
テーマ解析:
MAXを求めます:毎回2つの最小の数を選びます
MINを求めます:毎回2つの最大の数を選びます
計算のたびに並べ替えられるので、優先キューで解くか、挿入ソートで解くことができます.
優先キューは1つの数を入れるたびに自動的にソートされます
priority_queue ,less > p;//大きいから小さいまで
priority_queue ,greater > q;//小さい頃から
時間制限: 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<