20分 求助 找不到问题了 感谢好心的大佬
查看原帖
20分 求助 找不到问题了 感谢好心的大佬
170047
小渣青999楼主2020/8/24 10:22
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long int ll;
int a[100010];
int b[100010];int n,k;
bool cmp(int x,int y)
{
	return x>y;
}
ll judge(ll x)
{
	ll ans=0,lst=0;
	for(int i=0;i<n;i++)
	{
		
		if(a[i]>=0) 
		{
			lst+=a[i];
			if(lst>=x)
		    {
			    ans++;lst=0;
		    }
		}	
		else 
		{
			if(lst>(long long int)a[i]) lst-=a[i];
			else lst=0;
		}
	}
//	printf("mid:%lld ans:%lld\n",x,ans);
	return ans;
}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	sort(b,b+n,cmp);
	ll r=0,l=1,rtmp;
	for(int i=0;i<=n/k;i++)  r+=b[i];
	rtmp=r;
	ll minn,maxx;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		int tmp=judge(mid);
		if(tmp>=k) //比k大就继续找,直到找到单次最大的 
		{
			if(tmp==k) maxx=mid;
			else  maxx=mid+1;
			l=mid+1;
		}
		else r=mid-1;
	}
	l=1,r=maxx;
	while(l<=r)
	{
		//printf("l:%lld r:%lld\n",l,r);
		ll mid=(l+r)>>1;
		int tmp=judge(mid);
		if(tmp<=k)
		{
			if(tmp==k) minn=mid;
			else minn=mid-1;
			r=mid-1;
		}
		else l=mid+1;
	}
	printf("%lld %lld\n",minn,maxx);
	return 0;
	
}
2020/8/24 10:22
加载中...