买礼物的艰辛【二分】

Description–

小X同学给小C同学选了N件礼物,决定顺序购买并赠送,但作为一个没有工资没有零花钱的可怜小朋友,有M位好心的同学伸出了援助之手,然而为了减少最高的借款量,小X同学希望OI竞赛的你为他合理规划,使得他能轻松快乐地送出礼物。


Input–

第一行输入两个用空格隔开的正整数N和M
以下N行每行一个不超过10000正整数,依次表示礼物的价格。

Output–

一个整数,即最高借款量。


Sample Input–

7 5
100
400
300
100
500
101
400

Sample Output–

500


说明–

30%:n <=10
60%: n<=1000
100%: n<=100000


代码–

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,l,r,s,t,fy,mid,a[100005];
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];
	}
	while(l<=r)//二分答案
	{
		mid=(l+r)/2;
		s=mid-a[1];
		t=m,fy=0;
		for (int i=2;i<=n;++i)
		 if (s>=a[i]) s-=a[i];
		 else if(t>0) s=mid-a[i],t--;
		      else { fy=1; break; }
		if (fy) l=mid+1;
		else r=mid-1;
	}
	printf("%d",l);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43654542/article/details/90725536