1427:貧しい列数
[説明]
これは私がプライオリティキューを使用して行う質問ですQWQ
それの思考についてのトーク
これは貪欲タイトルです
私たちは、数字のセットを持っています
2各xの除去は、yが、その後、+ 1新しいX * yを追加します
あなたは最終的には最大数を取得することを確認する場合は、2つの最低数たびは、(最終的な結果は増加します)より大きい数と引き換えに、削除します
あなたは最終的には最小数を取得することを確認する場合は、次の2つの最大の数字を削除しているので(、そして最後に、あなたが最大の機会の乗算するように結果の最大数を失うことになる新しい番号と引き換えに、二大数字それぞれを削除ので、結果は減少傾向を提示しているように、この操作は、結果が最小であること)
[コード]
書式#include <iostreamの> の#include <cstdioを> する#include <アルゴリズム> 書式#include <cmath> の#include <CStringの> の#include < 文字列 > の#include <キュー> の#include <機能> 使用して名前空間はstd; int型 N、MAXN、ミネソタ州、シュウ、X、Y、AC [ 10001 ]。 PRIORITY_QUEUE < int型、ベクトル< int型 >、<大きな整数 >> 。 PRIORITY_QUEUE < int型 > B; %のD "& ; N) のための(int型 I = 1を iが<= N; iが++ ) のscanf(" %dの」、および、AC [i])と するために(int型 i = 1 ; iが++; iが<= N ) ; a.push(AC [i])と するための(int型 i = 1 ; iが<= N iが++ ) b.push(AC [i])と、 のための(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()。 以下のために(int型 I = 1 ; I <= N- 1、I ++ ) { X = b.top()を。 b.pop(); Y = )(b.top。 b.pop(); b.push(のx * yを+ 1 )。 } ミネソタ州 = b.top()。 printf(" %dの"、maxn- ミネソタ州)。 リターン 0 ; }