题目:
题解
题意:
把一段数列分成 M 段,并且满足各段所有数的和的最大值是所有分段方法中最小的
做法:
用二分枚举答案,易证:每段和的最大值一定在 l\~r 范围内( l 是数组中的最大值,r 是数组里所有数的和)
定义一个变量 mid 如果每段和的最大值最小为 mid 看能否分成 M 段,如果可以,在 l\~mid 里继续搜索,否则在 mid+1\~r 里
直到 l\=\=r 就是答案
#include<iostream>
#include<cstdio>
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<r) {
int mid=(l+r)/2;
if(check(mid)){
r=mid;
}else{
l=mid+1;
}
}
cout<<l;
}
文章评论
Great beat ! I wish to apprentice even as you amend your website, how can i subscribe for a weblog web
site? The account aided me a acceptable deal.
I had been tiny bit acquainted of this your broadcast provided
shiny transparent idea