714 - Copying Books

本文介绍了一种结合二分查找与贪心策略的算法来解决特定的区间划分问题。通过输入一系列整数,算法首先确定一个最大阈值,然后从前向后遍历数组并使用贪心策略来确定如何将这些数值划分到指定数量的组中。该算法的目标是最小化每个组的最大和。
摘要由CSDN通过智能技术生成
描述:采用二分+贪心策略,找出范围值,然后从后往前找就行“/”的位置判断
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值