• poj1505 copying books


    这个抄书, 确实要注意的细节很多。 首先从大体上看算法: 这题很明显是DP , 至于动态规划方程, 首先看要K个人抄写这N 本书, 我们可以从一个人抄写到K个人抄写这些书来推出, 最长需要用多长时间。 max_time = max(p[i]),   1<= i <= k,    , 然后因为每个人都要尽可能的少抄书, 并且每个人抄的书都是连续的几本书, 所以, 假设第i个人超的书我们可以枚举一下, 他抄到第j 本书, 当前最大的用时间是多少, i <= j <= n。 p[i][j] 表示第i 个人抄到了第j 本书, 当前最大的用时是多长。 p[i][j] = max( min(p[i - 1][t - 1],val[t] + ...+ val[j]));

    然后需要注意的是, 在打印的时候, 要记得所有的人都要有书抄。(我在这里wa 了好久)

    View Code
    #include<stdio.h>
    #include<string.h>
    #define maxn 508

    int map[maxn][maxn];

    void funs(int n, int k)
    {
    int t;
    map[1][0] = 0;
    for (int i = 1; i <= n; i ++)
    {
    scanf("%d", &map[0][i]);
    map[1][i] = map[1][i - 1] + map[0][i];
    }

    int tmp, sum, min;
    for (int i = 2; i <= k; i ++)
    {
    for (int j = i; j <= n; j ++)
    {

    sum = 0;
    min = map[1][j];
    for (t = j; t >= i; t --)
    {
    sum += map[0][t];
    tmp = map[i - 1][t - 1] > sum ? map[i - 1][t - 1]:sum;
    if (tmp <= min)
    {
    min = tmp;
    }
    else
    {
    break;
    }
    }
    map[i][j] = min;
    }
    }

    sum = 0;
    min = map[k][n];
    map[1][n + 1] = 0;
    t = n;
    tmp = k;

    while (t > 0)
    {
    sum = 0;
    while (tmp <= t && map[0][t] + sum <= min)
    {
    sum += map[0][t];
    t --;
    }
    tmp --;
    map[1][t + 1] = -1;
    }

    printf("%d", map[0][1]);
    for (int i = 2; i <= n; i ++)
    {
    if (map[1][i] == -1)
    {
    printf(" /");
    }
    printf(" %d", map[0][i]);
    }
    printf("\n");
    return;
    }

    int main()
    {
    int n , k;
    int count;
    scanf("%d", &count);

    while (count --)
    {
    scanf("%d%d", &n, &k);
    funs(n, k);
    }
    return 0;
    }


     

  • 相关阅读:
    H5页面富文本展示图片之间存在空隙
    如何关闭eslint语法校验
    K8S service详解
    vim添加或删除多行注释
    K8S 弹性伸缩
    Load高问题排查
    Dockerfile CMD和ENTRYPOINT
    nginx配置
    sed命令
    Pod排错指南
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/2436077.html
Copyright © 2020-2023  润新知