描述:采用二分+贪心策略,找出范围值,然后从后往前找就行“/”的位置判断
#include <cstdio>
#include <cstdlib>
int num[510],score[510];
int main()
{
//freopen("a.txt","r",stdin);
int n,m,t,k;
long long v,sum,max,count;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
sum=v=0;
int i=0;
for(; i<n; i++)
{
scanf("%d",&num[i]);
v=v<num[i] ? num[i] : v ;
sum+=num[i];
}
while(1)
{
max=(v+sum)/2;
if(max==v) break;
for(i=count=k=0; i<n; i++)
{
if(count+num[i]>max)
{
k++;
if(k==m) break;
count=0;
}
count+=num[i];
}
if(i==n) sum=max;
else v=max;
}
v=0;
for(count=0,k=m-1,i=n-1; i>=0; i--)
{
if(count+num[i]>sum||i==k-1)
{
--k;
score[v++]=i;
count=0;
}
count+=num[i];
}
for(v=v-1,i=0; i<n; i++)
{
if(!i) printf("%d",num[i]);
else printf(" %d",num[i]);
if(v>=0&&score[v]==i)
{
printf(" /");
v--;
}
}
printf("\n");
}
return 0;
}
714 - Copying Books
最新推荐文章于 2022-02-03 20:14:21 发布
本文介绍了一种结合二分查找与贪心策略的算法来解决特定的区间划分问题。通过输入一系列整数,算法首先确定一个最大阈值,然后从前向后遍历数组并使用贪心策略来确定如何将这些数值划分到指定数量的组中。该算法的目标是最小化每个组的最大和。
摘要由CSDN通过智能技术生成