財政援助POJ - - 2010武大学:運動コンテスト2.4プログラミングの課題

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

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

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

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

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

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

入力

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

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

出力

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

サンプル入力

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

サンプル出力

35

ヒント

出力例: ベッシーは5、35、及び50のCSATスコアを有する子牛を受け入れる場合、中央値は、必要とされる総資金援助は、18 + 30 + 21 = 69 <= 70である35です。
分数の間隔が大きすぎるため、唯一のグレード数の数が少ないから開始することができ、達成DP方法はありません、その点を注意してください。
見つけるのは難しいの中央値、中央値の要件を考えて、私は知らないが、我々は中間の値の範囲が存在しているはず、のが従わせ、ランキングのスコアを
中央値の前にN / 2ため、その後、N / 2の数は、決定されたN / 2と最小前に直接中央値、最小及びN / 2として可能な全てとの両方を介して、ありますプラスの中央値の値は、中央値の最大の中から選択することが可能である回答を選択することが可能である、F未満です。
我々は、ポストの中央値ソート牛[N / 2]ことを知って以来〜牛[C - N / 2]を選択する前と後のそれぞれの場合で算出範囲内(0からN-1末端の配列に)、N / 2フロントN / 2と最小となるように選択されます。
次いで、[N / 2](すなわち中央値の最小可能範囲)は、従来の中央値の中央値牛までの合計の数N / 2、選択されたすべての中央値のN / 2個だけかどうこれは、[すべて選択の前に、そして彼らのために入れてすることができます。もし後の中央値(即ち、第二の最小の選択可能な範囲)、次いでメディアン我々はN / 2このような数及び最小数のものに選択N / 2 + 1の数の合計前に、我々答えは状態から推定することができる - の状態がフル選挙であるので、この時間は、我々はより多くの残りの数よりも、我々は確かに牛の残りの部分にまで資金を供給する必要があります、我々はより多くの最後の時間の新しい牛[N / 2]よりもN / 2は牛がいる大きなを見て比較した最大の資金調達コストを必要とする前に牛を過ごします。後者の大きな場合は、前者が大きい場合、我々が追加されている、それはより多くの牛よりも費用がかかるので、もう一方の端の牛はすべての牛の関税で[0]〜牛[N / 2-1]が大きくなければならない、放置しましたその後、前のn / 2の状態は、最大の資金牛が、私たちは新しい牛が順番に、N / 2、フロントとなるように、少なくとも選択することができます[N / 2]いくつかの牛を交換していないが必要です最大が発見されやすくするために状態は、データ構造に保存することができます前に、選択したすべての時間は、時間や不必要な費用を節約するために、新しい交換で最大限の比較のN / 2を類推見つけます、我々はメンテナンスのためにプライオリティキューを使用しています。
ACコード:
する#include <stdio.hに> 
する#include <キュー> 
の#include <アルゴリズム> 
名前空間STDを使用して、
構造体牛{ 
	INTスコア; 
	INT必要性を、
	友人BOOL演算子<(牛X、Y牛)
	{ 
		リターンx.score <y.score ; 
	} 
}ウシ[100005]; //レコード資金牛の状態、スコアスコア、必要に必要
PRIORITY_QUEUE <整数> pq_pre、pq_pos; // pq_pre: nビットを享受前/番号2、及びその結果、補助金の最小量後にN / 2桁の数字から採取したプライオリティキュー、pq_pos 
// iは、前のI N / 2個なので、その最小値と補助金の額から取られた時間の中央値で、[100005] INTプリ
INT POS [100005]; 
int型の合計、ANS = -1;答えが存在しない場合// -1、総中間変数は、POSの値を計算または事前さ
INT cow_numを; //単純なカウント関数
INTメイン(ボイド)
{ 
	int型のN末端、C、F、
	scanfの( "%D%D%D"、およびN-、&C&F); 
	(INT I = 0; I <C。I ++)
	{
		scanf関数( "%D%D"、&牛[I] .score、&牛[I] .need);	 
	} 
	ソート(牛、牛+ C); //ソートスコア
	(INTのI 0 =、I <N / 2; I ++)//牛[N / 2] .need前部及び最小のN / 2からのビットの数であるN / 2を組み合わせたフロントを、初期化
	{ 
		合計=牛+ [I] .need; 
		pq_pre.push(牛[I] .need); //キューの前部にも覚え
	} 
	ため(INT I = N / 2、I <C - 2 / N-; I ++)
	{ 
		プレ[I] =総; 
		キュー//(C == 1が防止されている)場合、非空の場合、キューおよび新しいより牛における(pq_pre.empty()&&牛[I !] .need <pq_pre.top()) 牛は、最大前にキューを削除し、その後、最大小さなに資金を供給牛の新しいヘッドに置き換えられ
		、{ 
			合計- pq_pre.top =(); 
			pq_pre.pop(); 
			合計=牛+ [I] .need。
			pq_pre.push(牛[I] .need); 
		} 
	} 
	= 0合計。
	(INT I = C - 1 ; I> = C - N / 2; I - )// 牛のうち同様に算出された中央[C - N / 2 - 1] N / 2ヘッド
	{ 
		合計+牛= [I] .need; 
		pq_pos.push(ウシ[I] .need); 
	} 
	のための(INT I = C - 2 / N- - 1; I> = N / 2; i--)
	{ 
		POS [I]合計=; 
		IF(pq_pos.empty()&&牛[I] .need <pq_pos.top()!)
		{ 
			合計- pq_pos.top =(); 
			pq_pos.pop(); 
			合計=牛+ [I] .need ; 
			pq_pos.push(牛[I] .need); 
		} 
	} 
	のための(INT I = C - 2 / N- - 1; I; I> = N / 2 - )//最初のトラバーサル見つかりました降順答えが条件に沿ったものである場合
		(PRE [I] + POS [I] +牛[I] .need <= F)IF 
		{ 
			; ANS =牛[I] .score 
			BREAK; 
		} 
	のprintf(「%のD \ N」、ANS)。
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/jacobfun/p/12244509.html