zoukankan      html  css  js  c++  java
  • UVA 714 Copying Books

    题意:

      要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的。每个抄写员的速度是相同的,求所有书抄完所用的最少时间的分配方案。

    分析:

      这个题以前做过。就是先二分出来,最大的区间最小值。然后一重循环查找输出/就好

    代码:

      

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn=505;
    int m,k;
    long long maxans;
    int num[maxn],ans[maxn];
    bool judge(long long x)
    {
    int sum=0,t=k;
    int i;
    for(i=0;i<m;i++)
    {
    sum+=num[i];
    if(sum>x)
    {
    i--;
    sum=0;
    t--;
    }
    if(!t)
    {
    if(i!=m-1)
    return false;
    else
    return true;
    }
    }
    return true;
    }
    void solve()
    {
    memset(ans,0,sizeof(ans));
    long long l,r,mid;
    l=0;r=maxans;
    while(l<r)
    {
    mid=(l+r)/2;
    if(judge(mid))
    r=mid;
    else
    l=mid+1;
    }
    int sum=0,i;
    for(i=m-1;i>=0;i--)
    {
    sum+=num[i];
    if(sum>r)
    {
    sum=0;
    ans[++i]=1;
    k--;
    }
    }
    i=1;
    while(k>1)
    {
    for(;i<m;i++)
    {
    if(!ans[i])
    {
    ans[i]=1;
    k--;
    break;
    }
    }
    }
    printf("%d",num[0]);
    for(i=1;i<m;i++)
    {
    if(ans[i])
    printf(" /");
    printf(" %d",num[i]);
    }
    printf(" ");
    }
    int main()
    {
    int t;
    scanf("%d",&t);
    while(t--)
    {
    maxans=0;
    scanf("%d%d",&m,&k);
    int i;
    for(i=0;i<m;i++)
    {
    scanf("%d",&num[i]);
    maxans+=num[i];
    }
    solve();
    }
    }
  • 相关阅读:
    软工作业06
    软工作业05
    软工作业00
    软工作业04
    软工作业03
    软工作业02
    我的随笔
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    软件工程作业00——问题清单
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4964544.html
Copyright © 2011-2022 走看看