为什么左端点不能从1开始二分? 下面是两个开始二分的时候左端点不同代码
80pts代码
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1e5+5;
int n,m,l,r,ans;
int a[MAXN];
bool check(int mid){
int k = 1,sum = 0;
for(int i=1;i<=n;++i){
if(sum + a[i] <= mid) sum += a[i];
else sum = a[i],k++;
}
if(k <= m) return true;
else return false;
}
void ef(int l,int r){
int mid = (l+r) >> 1;
if(l == r) return ;
if(check(mid)){
ans = mid;
ef(l,mid);
}
else{
ef(mid + 1, r);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
l = max (l,a[i]);
r += a[i];
}
ef(1,1000000000);
printf("%d",ans);
}
100pts代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1e5+5;
int n,m,l,r,ans;
int a[MAXN];
bool check(int mid){
int k = 1,sum = 0;
for(int i=1;i<=n;++i){
if(sum + a[i] <= mid) sum += a[i];
else sum = a[i],k++;
}
if(k <= m) return true;
else return false;
}
void ef(int l,int r){
int mid = (l+r) >> 1;
if(l == r) return ;
if(check(mid)){
ans = mid;
ef(l,mid);
}
else{
ef(mid + 1, r);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
l = max (l,a[i]);
r += a[i];
}
ef(l,1000000000);
printf("%d",ans);
}