80分第四个点wa,球球大佬们改一改
查看原帖
80分第四个点wa,球球大佬们改一改
921417
crean_楼主2023/8/10 22:35
#include<bits/stdc++.h>
using namespace std;
int n,m,minnn=0x7f7f7f7f;
int arr[100005];
long long sum=0;
long long check(long long x){
	long long tmp=arr[0],jl=0;//tmp为该子数列的和 ,jl为子数列数量 
	for(int i=1;i<n;i++){
		if(arr[i]+tmp>x){//如果加上下一个数会超过最大值 
			jl++;
			tmp=0;//切割并计数+1 
		}
		tmp+=arr[i];
	}
	return jl+1;
}
long long ef(long long l,long long r){
	while(l<r-1){
		long long mi=(l+r)/2;
		long long x=check(mi);//检查当最大值为mi时是否能满足子数列段数的要求 
		//printf("l:%d r:%d x:%d\n",l,r,x);
		if(mi<minnn) return r;
		if(x>m) l=mi;
		else r=mi;
	}
	return r;
}
int main(){
 	scanf("%d%d",&n,&m);
 	for(int i=0;i<n;i++){
 		scanf("%d",&arr[i]);
 		sum+=arr[i];
 		minnn=min(minnn,arr[i]);
	 }
	long long ans=ef(0,sum);
	printf("%lld",ans);
	return 0;
}

2023/8/10 22:35
加载中...