二分求出最大值,然后我觉得不好做的是输出格式
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
int book[600];
int v[600];
long long mid;
bool match()
{
int t=0,i;
long long xsum=0;
for(i=1; i<=n; i++)
{
xsum+=book[i];
if(xsum>=mid)
{
xsum=book[i];
t++;
}
if(t>=k)
return false;
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
int t,i,j;
long long sum,l,r;
cin>>t;
while(t--)
{
cin>>n>>k;
sum=0;
for(i=1; i<=n; i++)
{
cin>>book[i];
sum+=book[i];
}
l=0;
r=sum;
while(l<r)
{
mid=(l+r)>>1;
if(match())
r=mid;
else
l=mid+1;
}
memset(v,0,sizeof(v));
for(int cnt=0,tot=0,i=n; i>0; i--)
{
tot+=book[i];
if(book[i]>mid)
mid=book[i];
if((cnt<k-1)&&(tot>mid||i<k-cnt)) // 区间值大于最大值或是所剩元素与所剩区间数相等时都需划分
{
v[i] = 1;
tot= book[i];
++cnt;
}
}
for(i = 1; i <=n; i++)
{
printf("%d%c", book[i], i != n ? ' ' : '\n');
if(v[i])
printf("/ ");
}
}
return 0;
}