#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
#include<cstring>
#include <algorithm>
#define N 505
#define MIN 1e-11
#define M 32010
#define MM 70000
#define LL long long
using namespace std;
int n,t,k;
int a[N],b[N];
int pan(int ans)
{
int cnt=0,sum=0;
for(int i=0; i<n; i++)
{
sum+=a[i];
if(sum>ans)
{
cnt++;
if(cnt>k)
return 0;
sum=0;
i--;
}
}
if(sum!=0)
cnt++;
if(cnt>k)
return 0;
return 1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ex.in","r",stdin);
#endif
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
long long sum=0;
for(int i=0; i<n; ++i)
{
scanf("%d",&a[i]);
sum+=a[i];
}
LL l=0,r=sum;
while(l<r)
{
LL mid=(l+r)>>1;
if(pan(mid))
r=mid;
else
l=mid+1;
}
sum=0;
memset(b,0,sizeof(b));
int cnt=0;
for(int i=n-1;i>=0;i--)
{
sum+=a[i];
if(sum>l)
{
b[i]=1;
cnt++;
sum=0;
i++;
}
}
if(cnt<k-1)
{
cnt=k-1-cnt;
int num=0;
for(int i=0;i<n&&num<cnt;i++)
{
if(!b[i])
{
b[i]=1;
num++;
}
}
}
printf("%d",a[0]);
if(b[0])
printf(" /");
for(int i=1; i<n; i++)
{
printf(" %d",a[i]);
if(b[i])
{
printf(" /");
}
}
printf("\n");
}
return 0;
}
714 - Copying Books--二分经典
最新推荐文章于 2024-11-17 18:00:00 发布
本文探讨了一种解决复杂数值序列问题的高效算法实现。通过使用C++编程语言,作者展示了如何通过一系列精心设计的数据结构和算法来解决实际问题。文中详细介绍了算法的实现过程,包括对序列进行划分、计算区间和优化处理等关键步骤。同时,通过实例演示了算法在实际应用中的效果,验证了其高效性和实用性。

682

被折叠的 条评论
为什么被折叠?



