zoukankan      html  css  js  c++  java
  • 复制书稿

    【题目描述】

    现在要把m本有顺序的书分给k个人复制,每一个人的抄写速度都一样,一本书不允许给两个或以上的人抄写,分给每一个人的书必须是连续的,比如不能把第一、第三和第四本书给同一个人抄写。

    现在请你设计一种方案,使得复制时间最短。复制时间为抄写页数最多的人用去的时间。

    【输入描述】

    第一行两个整数m、k(k ≤ m ≤ 500);     

    第二行m个整数,第i个整数表示第i本书的页数。

    【输出描述】

    输出共k行,每行两个整数,第i行表示第i个人抄写的书的起始编号和终止编号。k行的起始编号应该从小到大排列,如果有多解,则尽可能让前面的人少抄写。

    【样例输入】

    9 3

    1 2 3 4 5 6 7 8 9

    【样例输出】

    1 5

    6 7

    8 9

    源代码:
    
    #include<cstdio>
    #include<cstring>
    int m,n,k,i[501],sum[501]={0},f[501][501];
    void x1(int t)
    {
        int num(0),s;
        s=t;
        for (int a=t;num<=k&&t>=0;a--)
        {
            num+=i[a];
            t--;
        }
        t++;
        if (t>0)
          x1(t);
        printf("%d %d
    ",t+1,s);
    } //贪心倒序求解。 
    int main()
    {
        scanf("%d%d",&m,&k);
        n=k;
        memset(f,0x3f,sizeof(f));
        for (int a=1;a<=m;a++)
        {
            scanf("%d",&i[a]);
            sum[a]=sum[a-1]+i[a];
            f[1][a]=sum[a]; //求区间和。 
        }
        for (int a=2;a<=k;a++)
          for (int b=1;b<=m;b++)
            for (int c=1;c<b;c++)
            {
                int t;
                t=f[a-1][c]>sum[b]-sum[c]?f[a-1][c]:sum[b]-sum[c]; //分段取大。 
                f[a][b]=f[a][b]<t?f[a][b]:t; //状态取小。 
            }
        k=f[k][m];
        if (m) //考虑各种0的情况。 
          x1(m);
        else
          if (n)
            for (int a=1;a<=n;a++)
              printf("0 0
    ");
        return 0;
    }
  • 相关阅读:
    个人vim配置文件
    ORA-4031错误 解决方法
    HashMap在高并发下引起的死循环
    优先队列的应用
    java导入大量Excel时报错
    软件设计师必备——操作系统&#183;
    Java Security安全系列文档翻译笔记————KeyStore、密钥、证书、命令行实战
    能变成有钱人的五个金玉良言(转)
    c3p0链接池
    js中获取键盘事件
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5302986.html
Copyright © 2011-2022 走看看