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