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;
}