2019年9月29日陪審

タイトル説明

陪審制度は候補としてN-人の陪審員の市民の中から審査員によって選出されます。そして、被告の当事者は、元M-メンバーの陪審員を選ぶために、陪審員は有罪かどうかを決定します。
まず、すべての候補者への手続に参加する双方は、0〜20の間のスコアを獲得。i番目の個々のスコアは[i]とB [i]のように記録しました。公平を期すためには、M Dと検察側の原告評価評価差分絶対値和Pの合計満たしている必要があり選出された裁判官| DP |最低。選択方法が一意でない場合、D + Pを選択することは、プログラムの最大値です。

エントリー

最初の行は、2つのスペースで区切られた整数n及びmを有する候補です。

各挙動のスペースで区切られ、次の二つの数字のn行は、[i]とB [I]を表します。

輸出

M候補に従って小から多数順次出力する第二列、2本の出力線を含む、P及びDの最初の二つの行為の数は、問題の意味の説明を参照。

サンプル入力
4 2 
1 2 
2 3 
4 1 
6 2
サンプル出力
6 4 
2 3
プロンプト

[データ範囲]

100%のデータを満たす:1 <= N <= 200,1 <= M <= 20


この問題はDPであることを確認するために簡単ですが、ヒントの様々なを使用する必要があります。;
(以下、単に制御された差を主張という)防御と検察との差、及び防御と検察はコントロールに結合された(以下、単に制御および防御と称される):タイトル、2つの有用な変数の合計:最初の状態を意味します一次元シーケンスを転送し、我々は法の状態の表現を取得します:
DP [i] [j]は、jは防衛制御差分時間制御および防御され、選択された個人Iを示しています。
 
DP iは------私たちは、個々の中から選択しているように、転送順序は、最初の次元が転送順序を制御するために使用されて簡単に確認することができ、上記いえば> I + 1は、個人から選択されています。
私たちは、転送の条件を分析してみましょう:
一人一人が一度だけ選択することができますので、(1)、新たに選出された。この人はあまりにも選択してはいけません。
(2)制御及び最大防衛要件ので、そう新しい差を満たすために差動を制御元の制御ディベートの議論よりも大きいです。
私たちは[i]は、起訴スコアB [i]は、スコアのためのi番目の個別の防衛を表すと仮定し、我々は伝達方程式を得ます:
(jが選択されていない場合、私が個人[I] [K] + [J] + B [J]> DP [I + 1] [KA [J] + B [jを通って、DP選択前面から選択されています) )この値DPを更新
我々は制御防御防御スコアに厳密に従って差分算出する際に留意するので - スコア検察計算を、我々は標準値スタンド= 20 * mを、アレイの第二の寸法を設定し、適切なDP防御スコアを示す - スコア+訴追を立っています。
 
出力j番目の個別の番号を見つけて選択する方法については、既に選択されていませんか?
私たちは、アレイのパスを使用[i] [j]は、個人が選んだ表しI jの差動議論と主張し、選挙人iが最大の制御を支配者、私たちはすべてのステップに選出された人を見つけるために戻ってから前方に移動することができますし、出力も前方にあっ見つけるために、ステップバイステップすることができます前に、特定の人を選択していませんでした。
どのようにDとPの出力?我々は、最終的な制御された差動ディベートスタンドを知る+ kが最小と制御防御防御と最大制御との間の時間差であり、(我々は防衛あたりスコア、アレイレコードスコア当たりBの起訴を記録する配列を使用仮定)、Kに等しくなければなりません原理によれば+スタンド、その差、我々は、(既知でなければならない(すべて[i]と選択された)ことを必要とする - ([i]が全て選択されたの合計をB ALL [i]との和選択) [i]が全て選択さの和)をBと(すべて[I] +全てのBの和[i]と)選択された選択された - すべては[i]との和を選択しました。我々は最初のkスタンド知っている、第二には、DP [M] [K]であり、そして我々は、二つの防御ポイント、共感検察の和を得るためにこれら二つを分けます。
コードの場合:
書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム>
 に#define int型、長い長い
 使って 名前空間はstdを、
INTの N、M、[ 10050 ]、B [ 10050 ]、DP [ 1050 ] [ 1050 ]、パス[ 1050 ] [ 1050 ]、スタンド、ANS [ 1050 ]。
main()の符号付き
{ 
    scanf関数(" %のLLDの%のLLD "、&​​N、&M)を、
    以下のためにint型 i = 1 ; iが<= N; iは++)scanf関数を(" %LLD%LLD"、&​​A [I]、&B [I]); 
    のmemset(DP、 - 1はsizeof DP); // タグの状態がすべて実現可能である 
    スタンド= 20である * M; 
    DP [ 0 ] = [スタンド] 0// 防衛制御差が0個人防衛制御から選択され、0であり、最大値は0である
    ためINT J = 0 ; J <M、J ++)// 列挙は、少数の人々選択した
    {
         ためINT K = 0 ; K <スタンド* = 2 ; K ++ 
        { 
            IF(DP [J] [K]> = 0// この状態可能であれば
            {
                 についてINT I = 1 ; I <= N - 、Iは++)// [選択
                {
                     IF(DP [J] [K] + [I] + B [I]> DP [J + 1 ] [K + A [I] -b [I]]) // 制御及び防御比較
                    {
                         int型の T1 = J、T2 = Kと、
                         一方(T1> 0!&&パス[T1]、[T2] = I)
                        { 
                            T2 - A = [パス[ T1]、[T2] - B [パス[T1]、[T2]];
                             - T1; 
                        } //J iはフロント個体を下降が選択されていない検索
                        IF(!T1)
                        { 
                            DP [j個の + 1 ] [K + A [i]が-b [I] DP = [J] [K] + [I] + B [I]、
                            パス[J + 1 ] [K + A [I] -b [I] = I; 
                        } // ならないオプションも、記録および制御パス及び防衛
                    } 
                } 
            } 
        } 
    } 
    INT J = 0 ;
     一方(DP [M] [+ Jスタンド] < 0 && DP [M] [スタンドJ]を< 0)J ++; // 双方向ルックアップが可能になるまでを見つけるために
    INT= K(DP [M] [+ Jスタンド]> DP [M] [スタンドJ])+ Jスタンドを:;?-Jスタンド// 同じ大きさの絶対値を比較した場合、及び防御の二種類の制御 
    のprintf(" %のLLDをLLD%\ N- "、(K +スタンドDPを[M] [K])/ 2、(K +スタンドDP [M] [K])/ 2); // その差D原理およびP 
    INT T = K;
     のためのINT I = 1 ; I <= M; I ++ 
    { 
        ANS [I] =パス[M-I + 1 ] [T]; 
        T - = A [パス[M-I + 1 ] [T] -b [パス[M-I + 1 ] [T]]; 
    } // 選択されたルックアップ逆 
    ソート(+ ANSを1、M + + ANS 1。); // 辞書式に順序付けすることによって
    ためにint型 Iは= 1 ; I <= M、Iが++)のprintf(" %のLLD "、ANS [I]); // 出力応答
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/qxds/p/11609769.html