題目描述
依次給出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分別代表序列的...