トピックリンク
問題の意味
M連続するセグメントのシーケンスに分割され、そのためここで最小および最大期間です。
考え
明白な応答単調大きい答え、比較的少ないのサブセグメントの数。
でも小さいのに対し、この値よりも大きくする必要がありますMよりもセグメントの数は、答えを説明する場合は、サブ段落としてこの値を答えることができるかどうかを確認し、その後、半分の値とすることができます。
(二項はああ入門質問に答えます)。。。
二分回答テンプレートを書くための良いアイデア。。テンプレートの李Yudong偉大な神-半分は読み取ることはできません。。。
コード
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <ベクトル> の#include <地図> の#include <cmath> の#include <cstdlib> の#include <CTIME> の#include <キュー> 使用して 名前空間はstdを、 const int型のmx = 1E5 + 5 。 const int型 INF = 1E9; INTのN、M。 INT [MX]。 、CNT = 0 。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ 場合(和+ [i]は> 中間の){ 合計は = [I]。CNT ++; 続け; } 和 + = A [i]は、 } 戻り CNT> = M。 } int型のmain(){ CIN >> N >> M。 INTは L = 0、R = 0 。 以下のために(int型 i = 1 ; iは= N <; iは++)scanf関数を(" %のD "、&[i])と、L = MAX(L [i])と、R + = [I]。 一方、(L <= R){ int型ミッド=(L + R)>> 1 。 もし(チェック(MID)){ L =ミッド+ 1 。 } 他 R =半ば1 。 } のprintf(" %d個の\ n " 、L)。 リターン 0 ; }