牛客小公尺 最優分割 經典二分最小化最大值

2021-10-06 21:12:39 字數 2498 閱讀 5324

題目描述

依次給出n個正整數a1,a2,… ,an,將這n個數分割成m段,每一段內的所有數的和記為這一段的權重, m段權重的最大值記為本次分割的權重。問所有分割方案中分割權重的最小值是多少?

輸入描述:

第一行依次給出正整數n,m,單空格切分;(n <= 10000, m <= 10000, m <= n)

第二行依次給出n個正整數單空格切分a1,a2,… ,an (ai <= 10000)

輸出描述:

分割權重的最小值

示例1輸入

複製

5 3

1 4 2 3 5

輸出

複製

5
說明

分割成 1 4 | 2 3 | 5 的時候,3段的權重都是5,得到分割權重的最小值。

很老的二分題了

二分答案,check函式判斷是否可以分割成m

如果mid分割個數cnt大於m說明猜mid小了,可以向右邊擴大一點

#ifdef debug

#include

#include

"/home/majiao/mb.h"

#endif

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn ((int)1e5+7)

#define ll long long

#define int long long

#define inf (0x7f7f7f7f)

#define fori(lef, rig) for(int i=lef; i<=rig; i++)

#define forj(lef, rig) for(int j=lef; j<=rig; j++)

#define fork(lef, rig) for(int k=lef; k<=rig; k++)

#define qaq (0)

using

namespace std;

#define show(x...) \

do while (0)

void

err(

)template

<

typename t,

typename..

. a>

void

err(t a, a.

.. x)

namespace fastio

void

print()

template

<

typename t,

typename..

. t2>

inline

void

read

(t &x, t2 &..

. oth)

while

(isdigit

(ch)

) x *

= f;

read

(oth...

);}template

<

typename t,

typename..

. t2>

inline

void

print

(t x, t2.

.. oth)

while

(x/=10)

;while

(p3>=0)

putchar

(print_f[p3--])

;putchar

(' ');

print

(oth...

);}}

// namespace fastio

using fastio::print;

using fastio::read;

int n, m, q, k, a[maxn]

;int

check

(int mid)

}// show(cnt, m, mid);

return cnt > m;

}signed

main()

else

}printf

("%lld\n"

, lef)

;#ifdef debug

clock_t etime =

clock()

;printf

("rum time: %lf 秒\n",(

double

)(etime-stime)

/clocks_per_sec)

;#endif

return0;

}

二分 最小化最大值

注意答案的二分性質,必須要滿足在滿足給定條件的所有情況的時候都滿足要求才能更新ans。include using namespace std typedef long long ll inline ll in while c 0 c 9 res res 10 c 48,c getchar retur...

連續序列分成m段,最大值最小化,二分經典

這題比較巧妙地去猜答案,二分,重點是怎麼求m段的連續和是否滿足,這裡用了乙個貪心,不大於x,就一直把線往後移,大於的話就加一條線。include include include include include include include include includeusing namespac...

zzuli 1919 二分 最大值最小化

description 晴天想把乙個包含n個整數的序列a分成連續的若干段,且和最大的一段的值最小,但他有強迫症,分的段數不能超過m段,然後他就不會分了。他想問你這個分出來的和最大的一段的和最小值是多少?input 第一行輸入乙個整數t,代表有t組測試資料。每組資料第一行為兩個整數n,m分別代表序列的...