1、好题
洛谷p1182数列分段
二分算法区别于其他算法本质:化求解为判定,降低难度
更仔细点就是:
#个人认为,二分答案由“二分”和“答案”组成。宏观上,二分,是对问题状态空间的一种遍历方式,主要作用是降低时间复杂度;
#答案,即枚举答案,则是一种解题方法,主要作用是化求解为判定,降低难度。
#二分的本质:化求解为判定,降低难度
#个人认为,二分答案由“二分”和“答案”组成。宏观上,二分,是对问题状态空间的一种遍历方式,主要作用是降低时间复杂度;
#答案,即枚举答案,则是一种解题方法,主要作用是化求解为判定,降低难度。
n,m=map(int,input().split())
ls=list(map(int,input().split()))
left,right=max(ls),sum(ls)#最小和、最大和
#其实可以在最小和和最大和直接遍历,但是为了加速,使用二分查找
ans=0
#其中,check函数的作用在于给定一个和MaxSum,在数组arr中找到根据该给定和可以分成多少组,
#最后将最后分得组数和指定组数m做对比,然后指导下一步操作。
def check(mid):
Sum,cnt=0,1
for num in ls:#截成cnt段数,每一段数的总和小于等于mid
if Sum+num<=mid:
Sum+=num
else:
Sum=num#截断
cnt+=1
return cnt<=m#枚举的和太大,导致分段太少,要让和小一点
while left<=right:
mid=(left+right)//2
if check(mid):#枚举的和太大
ans=mid
right=mid-1
else:#枚举和太小
left=mid+1
print(ans)
好的题解链接: