89分求调
查看原帖
89分求调
739214
dmx7u19x楼主2023/9/22 15:25
#include<bits/stdc++.h>
using namespace std;

int m,k;
int o=0;
int a[600];
pair<int,int> r[600];
int len=0;

bool IF(int ans)
{
	int u=0;
	int ret=0;
	for(int i=1;i<=m;i++)
	{
		u+=a[i];
		if(u>ans)
		{
			u=a[i];
			ret++;
		}
		else if(u==ans&&i<m)
		{
			u=0;
			ret++;
		}
	}
	if(u>ans)
	{
		ret++;
	}
	if(ret>=k)
	{
		return 0;
		//需向大发展 
	}
	else
	{
		return 1;
		//需向小发展 
	}
}

int find()
{
	int left=0;
	int right=o;
	while(left<right)
	{
		int mid=(right + left) >> 1;
		if(IF(mid)==0)
		{
			left=mid + 1;
		}
		else
		{
			right=mid - 1; 
		}
	}
	return left;
}

int main()
{
	cin>>m>>k;
	
	for(int i=1;i<=m;i++)
	{
		cin>>a[i];
		o+=a[i];
	}
	
	
	int t=find();
	//cout<<t<<endl;
	int u=0;
	len=0;
	r[len].second=m;
	for(int i=m;i>=1;i--)
	{
		u+=a[i];
		if(u>t)
		{
			r[len++].first=i+1;
			u=a[i];
			r[len].second=i;
			continue;
		}
		if(u==t&&i>1)	
		{
			r[len++].first=i;
			u=0;
			r[len].second=i-1;
			continue;
		}
		if(u==t&&i==1)
		{
			r[len].first =1;
			continue;
		}
	}
	
	if(u<t)
	{
		r[len].first=1;
	}
	
	for(int i=len;i>=0;i--)
	{
		cout<<r[i].first<<" "<<r[i].second<<endl;
	}
	return 0;
}
2023/9/22 15:25
加载中...