poj2010武大学 - 財政援助のプライオリティキュー

説明

ベッシーは、人間は、彼らが出席することができ、多くの大学を持っているが、牛がどれを持っていないことを指摘しました。この問題を解決するには、彼女と彼女の仲間の牛は、新しい大学は、ウィスコンシンFarmsideの大学と呼ばれる短いため、「武U」形成しました。 

愚か平均よりも牛を認めることを望まないが、創業者は範囲1..2,000,000,000でスコアを生み出す牛修学適性試験(CSAT)と呼ばれる非常に正確な入学試験を作成しました。 

武Uは出席するのは非常に高価です。いないすべての子牛がit.In事実を買う余裕ができ、ほとんどの子牛は(0 <=援助<= 100,000)財政援助のいくつかの並べ替えを必要とします。すべてのお金は、大学の限られた資金から来なければならないので、政府は(その合計金額Fで、0 <= F <= 2,000,000,000)を、子牛への奨学金を提供していません。 

さらに悪いことに、武Uはapplied.Bessieを最大化するために、正確にN子牛を認めることを望んでいるC(N <= C <=10万)子牛の奇数N(1 <= N <= 19,999)のための教室を持っています教育の機会。彼女はまだ入院ふくらはぎの中央値CSATスコアはできるだけ高くなりたがっています。 

それらがソートされたときのサイズが奇数の整数の集合の中央値は、中間値であることを思い出してください。その下7とちょうど二つの値が上記二つの値が正確にあるように、例えば、セットの中央値{3、8、9、7は、5}、7です。 

子牛の総数が受け入れるように、適用される各ふくらはぎ、そしてベッシーは財政援助のために持っているお金の総額のスコアと必要な財政援助を考えると、ベッシーは慎重に子牛の最適なセットを認めることによって得ることができる最大の中央値スコアを決定。 

入力

* 1行目:スリースペースで区切られた整数N、C、およびF 

*行2..C + 1:行ごとに2つのスペースで区切られた整数。最初は、子牛のCSATスコアです。2番目の整数は、ふくらはぎのニーズ財政援助の必要量であります 

出力

* 1行目:単一の整数、ベッシーが達成できる最大の中央値スコア。N子牛、出力-1を認める十分なお金がある場合。 

サンプル入力

3 5 70 
30 25 
50 21 
20 20 
5 18 
35 30

サンプル出力

35

ヒント

出力例: ベッシーは5、35、及び50のCSATスコアを有する子牛を受け入れる場合、中央値は、必要とされる総資金援助は、18 + 30 + 21 = 69 <= 70である35です。 
 
問題の中国の意味:牛cが存在し、それぞれの牛が二つの属性は、お金をsocreた;、この条件が満たされたn個の金牛の性質及びF以下となるよう、nは牛から選択し、nは奇数でなければなりません前提の下でそのような中央値として大きいメジアンスコアを出力し、n個の牛(中央値スコア属性)前提条件出力を満たしていない場合1。
思考:牛が下降特性のスコアによってソートされるC、列挙トラバーサルは、前のN / 2牛お金前N / 2牛(最小属性値を見つけるためにI、I-1牛の頭にお金と最小ように)、同様に、i番目の乳牛でN / 2牛を同定します。第会う最初のN / 2牛お金とお金N / 2マネー牛や乳牛プラス<= Fを添加した後、I、i番目の牛の出力は、スコアができ、そうでない場合、出力1と、
タイムアウトコード:

書式#include <iostreamの>
の#include <cstdioを>
する#include <キュー>
の#include <アルゴリズム>
std名前空間を使用しました。
構造体ノード{
int型B、D。
} [100005]。
INT CMP(構造体ノードx、構造体ノードy){
(XB == YB)場合、戻りXD <YD。
他XB> YB返します。
}
int型のmain(){
int型N、C、F。
CIN >> N >> C >> F。
{ため(; iはC <I ++は、I = 0 INT)
のscanf( "%d個の%のD"、および[I] .B、&[I] .D)。
}
ソート(A + C、CMP)。
INTプラグ= 0。
//(I = 0 int型、iがCを<; I ++の)ため
///のprintf( "%D%D \ n"は、[I] .B、[I] .D)を、
(N == 1){もし
{(; iがCを<I ++は、I = 0の整数)のための
IF([I] .D <= F){
COUT << [i]は.B << ENDL。
プラグ= 1。
ブレーク;
}
}
}

{ため(; I <= C-1-N / 2 I ++は、I = N / 2 INT)
PRIORITY_QUEUE <整数、ベクトル<整数>、大きな<整数>> Q; //前面
PRIORITY_QUEUE <整数、ベクトル<整数>、大きな<整数>> P; //后面
ため(INT J = 0; J <I、J ++)
q.push([J] .D)。
int型のコスト= 0;
用(INT J = 0; J <N / 2であり、j ++)
コスト+ = q.top()、q.pop()。
用(int型J = I + 1、J <C; J ++)
p.push([J] .D)。
用(INT J = 0; J <N / 2であり、j ++)
コスト+ = p.top()、p.pop()。
(コスト+ [I] .D <= F){もし
COUT << [i]は.B << ENDL。
プラグ= 1。
// coutの<< 1 <<」「<<コスト<<てendl;
ブレーク;
}
// coutの<< 1 <<」「<<コスト<<てendl;
IF(プラグ== 0)COUT < < " - 1" <<てendl;
}
0を返します。
}

そう書き、多くの時間が必要以上に操作がn ^ 2つのレベルである)(プッシュタイムアウトを作り、()オペレーションをプッシュが存在するであろう。

実際のACコード、プッシュ()オペレーションは、nレベルです。

書式#include <iostreamの>
の#include <cstdioを>
する#include <キュー>
の#include <アルゴリズム>
std名前空間を使用しました。
構造体ノード{
int型のスコア、お金。
}牛[100005]。
INT [100005]前、後、[100005]; //分别表示前面部分的最小、和后面部分的最小、包括I本身
INT CMP(構造体ノードA、構造体ノードB){
IF(a.score == B。スコア)リターンa.money <b.money。
それ以外の戻りa.score> b.score。
}
int型のmain(){
int型N、C、F。
CIN >> N >> C >> F。
(I 0 = int型、iがCを<; I ++の)のため
のscanf( "%D%D"、および牛[I] .score、&牛[I] .money)。
ソート(牛、牛+ C、CMP)。
int型の合計= 0;
PRIORITY_QUEUE <整数> Q;
(I 0 = int型、iがN / 2 <; I ++の)ためq.push(牛[I] .money)、和+ =牛[I] .money。

{(; I <= C-1-N / 2 I ++は、I = N / 2 INT)のために
合計+ =牛[I] .moneyと、
q.push(牛[I] .money)。
sum- = q.top()。
q.pop();
[i]は=合計の前に、
}
和= 0。
(!q.empty())q.pop()しばらく;
q.push(牛[i]が.money)、和+ =牛[I] .money;(; I> C-1-N / 2 i-- iは、C-1 = INT)のために
[CN / 2] =和後、
以下のために(INT I =のC-1-N / 2、I> N / 2; i--){
合計+ =牛[I] .money。
q.push(牛[I] .money)。
sum- = q.top()。
q.pop();
[I] =和後、
}
int型のプラグ= 0。
{(私は++; I <= C-1-N / 2 I = N / 2 INT)のための
{IF(前に[I-1] +後に[I + 1] +牛[I] .money <= F)
プラグ= 1。
COUT <<牛[I] .score << ENDL。
ブレーク;
}
}
場合はcout <<(プラグ!) " - 1" <<
0を返します。
}

おすすめ

転載: www.cnblogs.com/sunjianzhao/p/11600003.html