Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的。他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1<=moneyi<=10,000),他想要为他连续的M(1<=M<=N)个被叫做“清算月”的结帐时期做一个预算,每一个“清算月”包含一个工作日或更多连续的工作日,每一个工作日都仅被包含在一个“清算月”当中。 FJ的目标是安排这些“清算月”,使得每个清算月的花费中最大的那个花费达到最小,从而来决定他的月度支出限制。
第一行:两个用空格隔开的整数:N和M
第2..N+1行:第i+1行包含FJ在他的第i个工作日的花费
#include <ctype.h>
#include <cstdio>
#define N 100005
inline void read(int &x)
{
x=0;
bool f=0;
register char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch==‘-‘) f=1;
for(; isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘;
x=f?-x:x;
}
int n,m,M[N];
bool check(int x)
{
int sum=0,now=M[1];
for(int i=2;i<=n;i++)
{
if(sum>m||M[i]>x) return 0;
if(now+M[i]<=x) now+=M[i];
else if(now+M[i]>x) sum++,now=M[i];
}
return sum+1<=m;
}
int main()
{
read(n);
read(m);
int l=0,r=0,ans;
for(int i=1;i<=n;i++) read(M[i]),l=M[i]>l?M[i]:l,r+=M[i];
for(int mid;l<=r;)
{
mid=l+r>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}