题目: 题解更好的浏览体验
题意:
把一段数列分成 M 段,并且满足各段所有数的和的最大值是所有分段方法中最小的
做法:
用二分枚举答案,易证:每段和的最大值一定在 l~r 范围内( l 是数组中的最大值,r 是数组里所有数的和)
定义一个变量 mid 如果每段和的最大值最小为 mid 看能否分成 M 段,如果可以,在 l~mid 里继续搜索,否则在 mid+1~r 里
直到 l==r 就是答案
#include#include using namespace std; int l,r,a[100005],m,n; bool check(int x){ int cnt(1),sum(0); for(int i=1;i<=n;++i){ if(sum+a[i]<=x){ //判断能否分成一段 sum+=a[i]; }else{ sum=a[i]; cnt++; //另开一段 } } return cnt<=m; //能否满足 } int main() { cin>>n>>m; for(int i=1; i<=n; ++i) { scanf("%d",&a[i]); l=max(l,a[i]); r+=a[i]; } while(l



