关于此题的一个疑问
查看原帖
关于此题的一个疑问
230580
Suzt_ilymtics楼主2020/10/3 11:09

为什么左端点不能从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);
}
2020/10/3 11:09
加载中...