题目很水,但是做了好久----代码两分钟,bug两小时。
#include<iostream>
#include<algorithm>
#include<cstdio>
#define LL long long
using namespace std;
const int M=100005;
LL n,m;
LL array[M];
LL ans;
bool judge(LL k)
{
int sum=0,re=0;
// cout<<k<<endl;
for(int i=0;i<n;++i)
{
if(array[i]>k)return 0;
if(sum+array[i]>k) //计数的时候注意流程
{
sum=array[i];
re++;
}
else sum+=array[i];
if(i==n-1)re++;
}
//cout<<re<<endl<<endl;
if(re>m)return 0;
else
{
ans=min(ans,k);
return 1;
}
}
int main()
{
while(cin>>n>>m)
{
int sum=0;
for(int i=0;i<n;++i)
{
scanf("%d",&array[i]);
sum+=array[i];
}
LL mid,l,r;
l=1,r=sum;
ans=0xfffff;
while(l<=r)
{
mid=(l+r)/2;
// cout<<l<<" "<<mid<<" "<<r<<endl;
if(judge(mid))r=mid;
else l=mid+1;
if(mid==l&&r==mid)break;//这行代码,可以防止l==r时多次检测
}
cout<<ans<<endl;
}
}