1436:列セグメントIIの数
問題の解決策
二値の答え
私たちの最終的な答えは、[[i]が最大([i])と、ΣA]値間隔です
L = MAX([i])と、R =ΣA[i]は、連続的に二部の中間の設定
半ばは最大値であり、各セグメント、各セグメントはなく、ミッド以上を表します
チェック機能へのレーンは、数に分割することができる中間セクションの場合の最大値を計算します
セグメントCNTの数> mは、中間小を示す場合、それはわずかに大きくすることができます
この時点では、CNTがmと等しくすることができるので、彼は本当の答えであれば、セグメントの数は、CNT場合は<=メートル、半ば大きなを示し、それは、記録されたこのミッド候補の回答(、最終的な出力は、その彼が少しありますが、そう、彼は小さいに更新されます)
コード
書式#include <iostreamの> の#include <cstdioを> する#include <アルゴリズム> 書式#include <cmath> の#include <CStringの> の#include < 文字列 > の#include <キュー> の#include <機能> 使用して名前空間はstd; INTの N、M、ANS、L = 0、R = 0 。 INT [ 100001 ]。 int型の合計[ 100001 ]。int型のチェック(INT X) { int型の CNT = 1、今= 0 。 にとって (int型 I = 1は iが++; iがn = < ) { 場合(今+ [I] <= X)が+ = [I]。 他の { CNT ++ ; 今 = [I]。 } } 戻り CNTを<= M。 } int型のmain() { scanf関数(" %D%dの"、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %dは"、& [I])。 L = MAX(L [I])。 R + = A [i]は、 } 一方、(L <= R) { int型ミッド=(R + L)/ 2 。 もし(チェック(MID)) { ANS = ミッド。 R =半ば1 。 } 他 L =ミッド+ 1 。 } のprintf(" %dの" 、ANS)。 }