我是传送门
- 分析:采用二分逐步测试最终可能的结果,所以前期先求出范围,然后采用二分,二分模板是查找筛选,这题是根据范围筛选;
- AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100010];
int main()
{
int n,t,i,left,right,cut,sum,mid;
left=right=0;
scanf("%d%d",&n,&t);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
left=max(left,a[i]);
right+=a[i];
}//规定一个猜测范围
while(left<right)
{
cut=1;
sum=0;
mid=(left+right)>>1;
for(i=1;i<=n;i++)
{
sum+=a[i];
if(sum>mid)//该分层部分即将超过猜的数,新建分层
{
sum=a[i];
cut++;
}
}
if(cut>t)//分层超了,说明猜的数偏小;
left=mid+1;//向中值偏大的方向猜,一定要加1,防止两个相邻数求平均值;
else if(cut<=t)//如果猜对了且left<right,猜的数往更小的方向发展,之后隔层只会偏多改变left,不改变right,最终跳出循环;
right=mid;
}
printf("%d\n",right);
}