#include <bits/stdc++.h>
using namespace std;
int a[200086];
int m,n;
int sum=0;
int mid;
bool check(int t)
{
int cnt=0,summ=a[0];
int i=0;
for (int i=1;i<n;i++)
//要注意判断最后一个summ
{
if(summ<t)
{
cnt++;
summ+=a[i];
}
else summ=a[i];
}
return cnt<=m;
}
int main ()
{
cin >> n >> m;
for(int i=0;i<n-1;i++)
{
cin >> a[i];
sum+=a[i];
}
int l=0,r=sum;
/* if(n-m==2)
{
cout << sum;
return 0;
}*/
while(l<r)
{
mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<< l;
return 0;
}
题目大意
第一行给出n.m,n表示座位的排数,m表示需要撤掉的座位排数。第二行给出n-1个数字,表示每一排与后一排的间隔,求最小间隔最大为多少。
大体思路
本题求最小值最大明显用二分法查找,选取check函数当符合条件,则summ总数可以相加,如果不符合,则重新计算summ,重新累加,然后利用二分查找的方式,得出答案