https://www.luogu.org/problemnew/show/P1182
题解 : 二分+贪心(最大值的最小值)
直接二分答案, check函数去贪心判断连续和最大值是否小于等于二分的内个值,若不是了,则加一个断点,注意断点一定是m-1分成m个区间.然后就是 上下界,L=数组中数据的最大值(连续和绝对大于该数)才能过第四个样例
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000000;
int a[maxn];
int n,m;
int check(int h){
int sum=0;
int num=0;
for(int i=0;i<n;i++){
if(sum+a[i]<=h) sum+=a[i];
else {
sum=a[i];
num++;//断了就加断点
}
}
// cout<<h<<"check "<<num<<endl;
if(num<m) return 1;
else return 0;
}
int main(){
cin>>n>>m;
int p=0;
int l=1;
for(int i=0;i<n;i++){
cin>>a[i];
l=max(l,a[i]);
p+=a[i];
}
int r=1e9+10;
int cnt=1e9+10;
while(l<=r){//直接二分答案
int mid=(l+r)/2;
if(check(mid)){
r=mid-1;
cnt=min(mid,cnt);
}
else{
l=mid+1;
}
}
cout<<cnt<<endl;
}