リンク: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型秒; }