牛オフの練習試合50C-tokitsukazeとSoldier-(+ソートプライオリティキュー)

リンク:https://ac.nowcoder.com/acm/problem/50439
出典:牛の乗客のネットワーク

ゲームでは、n個の兵士に兵士のいくつかを選択する必要がtokitsukazeコピーを再生するグループを構成しています。
Vへのi番目の兵士の戦闘力[i]は、戦闘力グループは連隊内のすべての兵士の力を戦っしています。
しかし、これらの兵士たちは特別な要求を持っている:あなたは、i番目の兵士を選択した場合は、兵士たちは、[i]はこれ以上s以下のグループの数を願っています。(あなたは、i番目の兵士を選択しない場合、この制限はありません。)
Tokitsukazeはかなりの戦闘力のグループを疑問に思いました。

アイデア:

仮にS [i]には、寛容と呼ばれています。

あなたがいないS [i]は、このプロパティをすれば、それは簡単な貪欲です。

許容値は、キュー内の兵士の数が少ない彼の許容値よりも見て正面からトラバーサルのバックトラバーサルに兵士に、降順の場合、それはポップよりも大きい場合は、ポップ兵士が予約、確かに低い戦闘能力であるポップ高い戦闘能力、そのプライオリティキューとキュー。寛容の大きな値にトラバースした後間違いなく良い許容値よりもまずトラバーサル、毎年ちょうどトレランス兵士の値を参照するにように、兵士の兵士の現在のキューの許容値を満たすために、キュー内の要素の数は必然的に満たしています。

輸入 java.utilの。* ; 

パブリック クラスメイン{
     静的ノード[] A = 新たなノード[100005 ]。
    
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        スキャナスキャン = 新しいスキャナ(System.in)。
        INT、N = scan.nextInt()。
        長い MAXX = -1 ;
        長い合計= 0 ;
        以下のためにINT iが= 0、I <N; I ++ ){ 
            [I] = 新しいノード()。
            [I] .V =  scan.nextLong()。
            [I] .S = scan.nextInt(); 
        } 
        は、Arrays.sort(A、 0、N-、新しい新しいコンパレータ<ノード> (){
             公共 のint (ノードP1、ノードP2){比較
                 リターンINT)(P2。 p1.s-S); // 配列、大きな放電許容フロント
            } 
        }); 
        優先度つきキュー <ノード> Q = 新しい新しい優先度つきキュー<ノード>(新しい新しいコンパレータ<ノード> (){
             公共 のint (ノードP1、ノード比較P2){
                 リターンINT)(p1.v-p2.v); //战力小的放前面
            } 
        })。
        INTが I = 0、I <N; I ++ ){
             ながら(q.size()> = {[I] .S)
                合計 - = q.poll()V。
            } 
            q.add([I])。 + = [I] .V。
            MAXX = Math.max(MAXX、合計)。
        } 
        のSystem.out.println(MAXX)。
    } 
} 

クラスノード{
     長いV。
    int型秒; 
}

 

おすすめ

転載: www.cnblogs.com/shoulinniao/p/12623127.html