好久没写二分搜索题了
这个题目大体意思就是给你一串数字
让你选出连续的m段数字使得和最大的数字段的和最小
就是二分答案
//
// Created by xingchaoyue on 2019/5/15.
//
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
const int maxn = 100000+100;
int a[maxn];
int le = 0;
int ri = 0;
bool judge(int x){
int total = 0;
int cnt = 0;
for(int i =0;i<n;++i){
if(total+a[i]<=x){
total+=a[i];
}
else{
cnt++;
total=a[i];
}
}
if(cnt<m){
return true;
}
else{
return false;
}
}
int main(){
cin>>n>>m;
for(int i =0;i<n;++i){
scanf("%d",&a[i]);
if(a[i]>le)
le = a[i];
ri+=a[i];
}
// cout<<le<<":"<<ri<<endl;
while(le<=ri){
int mid=(le+ri)>>1;
//cout<<le<<":"<<ri<<endl;
if(judge(mid)){
ri = mid-1;
}
else{
le = mid+1;
}
}
cout<<le<<endl;
}
/*
#include<iostream>
using namespace std;
int n,m;
int lef,rig,mid;
int total,tim;
inline bool judge(int x,int a[]){
for(int i=0;i<n;i++){
if(total+a[i]<=x)total+=a[i];
else total=a[i],tim++;
}
return tim>=m;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
rig+=a[i];
lef=lef>a[i]?lef:a[i];
}
//cout<<lef<<":"<<rig<<endl;
while(lef<=rig){
mid=(lef+rig)/2;
cout<<rig<<":"<<lef<<endl;
total=0,tim=0;
if(judge(mid,a))lef=mid+1;
else rig=mid-1;
}
cout<<lef;
return 0;
}*/