思路:
显然暴搜出每种情况在比较
但是
想A就要二分
设 x为MAX中的MIN,即每一段都要<=x,
可以寻找一个x满足分段的个数不超过m,
然后将满足条件的所有值中取一个min就是最优解。
C o d e Code Code:
#include <cstdio>
#include <iostream>
using namespace std;
int a[1000005], n, m;
bool check (int x)
{
int ans = 1, tot = 0;
for(int i = 1; i <= n; i++)
{
if(tot + a[i] > x)
{
ans++, tot = a[i];
if(a[i]>x) return 0;
}
else tot += a[i];
}
return ans <= m;
}
int main ()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
int l = 0, r = 1e9 + 10;
while(l < r)//二分模板
{
int mid = (l + r) >> 1;//>>1用/2会TLEEEEEEE
if(check(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n", l);
return 0;
}