トピックへのリンク:https://atcoder.jp/contests/abc144/tasks/abc144_e
非常に単純な二分法プラス貪欲、私はゲームで見たことがありません。私が間違っていた入力されたので、そこに6点であるプラスサンプルが右であったが、私は半分の時間がそれを見つけられませんでした確認し、最終的には唯一の自分のアイデアを放棄する間違っている疑いがあることができます。
(私は気にしない気にしない、データの鍋です!)難易度については、それは全くのT1 T2があってはなりません
上半期の回答の合計。
質問は今、あなたが望むされ、対応のF列は、[I] * F [i]が> SUM場合、K- = A [i]が-SUM / F [i]は、最後のKを参照するには0未満です。
その後、アウトカウント、その後、限り大、Fに小さなAとして降順いることがわかります最適なソリューションです。
なぜ?私たちは、しようとする2つの数値を取ることができます。
A1、A2、A1 <A2を取ります。
取B1 = SUM / F1、B2 = SUM / F2、F1> F2。
明らかにできるだけ小さい数を減算するので、減算数MIN(MAX(0、A1-B1)+ MAX(0、A2-B2)、MAX(0、A1-B2)+ MAX(0、 A2-B1))
6例の合計、それぞれ
1.A1 <A2 <B1 <B2 MIN = 0
2.A1 <B1 <A2 <B2 MIN = 0
3.B1 <A1 <A2 <B2 MIN =分(A1-B1、A2-B1)= A1-B1
4.A1 <B1 <B2 <A2 MIN =分(A2-B2、A2-B1)= A2-B2
5.B1 <A1 <B2 <A2 MIN =分(A1-B1 + A2-B2、A2-B1)= A1-B1 + A2-B2
6.B1 <B2 <A1 <A2 MIN = A1-B1 + A2-B2
私たちは、対応するああ、何もああを発見しました
だから、直接千万人の貪欲。手順は以下の通りです。
#include <iostreamの> する#include <CStringの> する#include <cstdlib> の#include <アルゴリズム> の#include <cstdioを> する#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 int型nは、彼; LL [ 1000009 ]は、B [ 1000009 ]。 LL ANS = 0 。 ブールチェック(LLサム、LL k)は、 { 彼 = 1 。 以下のために(int型 I = N; I> = 1 ; i-- ) { もし([彼] *のb [i]が<=合計){彼++。引き続き;} 場合(([彼] -sum / B [I])> k)を返し 偽。 K - [彼] -sum / = [I] Bと、 彼は ++します; } を返す 真。 } int型のmain() { LLのK。 scanf関数(" %Dの%のLLD "、&N&K)。 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %のLLD "、および[I])。 以下のために(int型 I = 1(scanf関数を、私は++; iが<= N)" %のLLD "、&B [I])。 ソート( + 1、A + 1個の + N)。ソート(B + 1、B + 1個の + N)。 LLのL = 0、R = 0 。 R = B [N] * [N]; ANS = R。 一方、(L <= R) { 中間LL =(L + R)/(LL)2 。 もし(チェック(MID、K))ANS =中間、R =半ば1 。 他リットル=ミッド+ 1 ; } のprintf(" %LLDする\ n " 、ANS)。 リターン 0 ; }