714 - Copying Books

描述:采用二分+贪心策略,找出范围值,然后从后往前找就行“/”的位置判断

#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;

}


你可能感兴趣的:(copy)