关于初试左边界的选取,为啥不能是A中的最小值?
查看原帖
关于初试左边界的选取,为啥不能是A中的最小值?
269795
codinghust楼主2021/10/13 20:38
#include<iostream>
#include<cstdio>
#include <cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=100005;
int n,m,sum;
long long a[N],maxa;

int main(){
	cin>>n>>m;
	maxa=0,sum=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxa=max(a[i],maxa);
	//为什么这里改成  maxa=min(a[i],maxa);	就不对呢?运行不出结果
	//我自己能理解这里max的作用,但是改成min就是改了左边界而已,
	//为啥这样就运行不出结果
	//我自己调试也发现,用min会死循环,但是我理论上没有理解
		sum+=a[i];
	}
	LL l=maxa,r=sum,mid;
	// printf("mina:%lld  sum:%lld  \n",maxa,sum); 


    if(n==m){
        cout<<maxa<<endl;
        return 0;
    }

	int num;
	while(l<r){
		mid=(l+r)/2;
		int s=0;
        num=0;
		for(int i=1;i<=n;i++){
			s+=a[i];
			if(s>mid&&i!=n){
				s=0;
				num++;
                i--;
			}else if(s>mid&&i==n){
                num+=2;
            }else if(s<=mid&&i==n){
                num++;
            }
		}
		if(num>m)	l=mid+1;
		else 	r=mid;
	}
	
	cout<<l<<endl;
    system("pause");
	return 0;
}
2021/10/13 20:38
加载中...