make a guess on the maximum pages assigned to one scriber each time
as for calculating the real maximum pages, j<k-1 ensures there are enough
scribers left, and if r+b[i]>mid, we should split here, or if i<k-j-1, means books
left are now enough, so have to assigned 1 book to 1 scriber for left books
/* UVas */
/*****************************************************************************/
int n, m, k;
int v[500];
long long b[500];
long long bin(long long mid) {
long long r=0, MAX=0;
for (int i=m-1, j=0; i>=0; i--) {
if (j<k-1&&(i<k-j-1||r+b[i]>mid)) {
MAX=max(MAX, r);
r=b[i];
v[i]=1;
j++;
}
else {
r+=b[i];
}
}
return max(MAX, r);
}
int main(void) {
cin>>n;
while (n--) {
cin>>m>>k;
long long l=0, h=0, mid, r;
for (int i=0; i<m; i++) {
cin>>b[i];
h+=b[i];
}
while (l<h) {
mid=(l+h)>>1;
r=bin(mid);
r>mid?l=mid+1:h=mid;
}
memset(v, 0, sizeof(v));
bin(l);
for (int i=0; i<m; i++) {
cout<<(i==0?"":" ")<<b[i]<<(v[i]?" /":"")<<(i==m-1?"\n":"");
}
}
return 0;
}
/*****************************************************************************/
No comments :
Post a Comment