714

Using binary search to find the minimum value,

#include <iostream>
#include <string.h>
#include <vector>

#define ll long long

using namespace std;

ll b[505];
vector<int> res[505];

int main()
{
	int t;
	int books,writer;

	cin>>t;

	while(t--)
	{
		cin>>books>>writer;
		ll total=0,minwrk=0,mid=0;
		for(int i=0;i<books;i++)
		{
			cin>>b[i];
			total+=b[i];
			if(minwrk<b[i])
			minwrk = b[i];
		}

		//bin search
		while(minwrk<total)
		{
			int required=1;
			ll sum=0;
			mid= (total+minwrk)/2;

			for(int i=0;i<books;i++)
			{
				if(sum+b[i]>mid)
				{
					required++;
					sum=0;
				}
				sum+=b[i];
			}
			if(required>writer)
			minwrk=mid+1;
			else
			total=mid;
		}

		ll sum =0;
		int j=writer-1;
		for(int i=books-1;i>=0;i--)
		{
			if((sum+b[i])>total || j>i)
			{
				j--;
				sum=0;
			}
			sum+=b[i];
			res[j].push_back(b[i]);
		}

		for(int i=0;i<writer;i++)
		{
			for(int l=res[i].size()-1;l>=0;l--)
			{
				if(l!=res[i].size()-1)
					cout<<" "<<res[i][l];
				else
					cout<<res[i][l];
			}
			res[i].clear();
			if(i!=writer-1)
			cout<<" / ";
		}
		cout<<"\n";
	}

	return 0;
}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *