P1182数列分段Section II
1.使用二分答案法,下界:max(a[i])上界:sum(a[i])
int sea(int l,int r){
int res=-1,mid,low=1,high=r;
while(low<=high){
mid=(low+high)/2;
if(check(mid)){
res=mid;
high=mid-1;
}
else low=mid+1;
}
return res;
}
2.check:如果a[i]加入本区间后<=x则加入,否则放在下一个区间,最后判断是否<=m,代码:
bool check(int x){
int sum=0,cnt=0;
for(int i=1;i<=n;i++){
if((sum+a[i])<=x){
sum+=a[i];
}
else{
cnt++;
sum=a[i];
}
}
if(sum!=0) cnt++;//判断sum,给剩余的一个区间
return cnt<=m;
}
3.无(只得了80分,努力改正ing~)
for(int i=1;i<=n;i++){
cin>>a[i];
ma+=a[i];//上界
mi=max(mi,ma);//下界
}
int res=sea(mi,ma);