【2分の1】プレゼントを買う苦労


XさんはCさんにN件のプレゼントを选んで、顺番に买って赠りましたが、给料も小遣いもないかわいそうな子供として、M人の親切な学生が援助の手を差し伸べました.しかし、最高の借金を减らすために、XさんはOIコンテストのあなたが合理的に计画して、彼に楽にプレゼントを送ることができることを望んでいます.
Input
最初の行には、スペースで区切られた2つの正の整数NとM以下のN行を入力し、行ごとに10000を超えない正の整数を入力し、贈り物の価格を順次表します.
Output
1つの整数、すなわち最高借入金量.
タイトルはバグがありますが、実はm+1人で、それから私はAになりました...答えの範囲は最大のa[i]からすべてのa[i]の和の間にあり、次いで2分midである.順番に取り、midまたはmid以内のお金を借りることができればr=mid、そうでなければl=mid+1で答えを出力します.
#include
#include
using namespace std; 
int n,m,a[100001],l;
long long r,mid;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		r+=a[i];
		l=max(l,a[i]);
	}
	++m;
	while(l<r){       //  
		mid=(l+r)/2;
		long long s=0,k=0,lq=0,lr=0;
		while(k<n){   
			++k;   //   k 
			if(lq+a[k]<=mid) lq+=a[k];   //      ,       
			else{   //     ,              
				lr++;   //      
				lq=0;   //   
				if(lr>m) break;   //      ,  
				--k;   //      
			}
		}
		if(lq>0) lr++;   //         
		if(lr>m) l=mid+1;   //       
		else r=mid;
	}
	printf("%d",l);
}