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

    这道题貌似是个贪心,实际是个DP

    【题目描述】

    现在要把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

    这道题据戴佬(@DJY_01)所说,是可以用纯贪心做的,虽然最后被我们老师卡掉了。

    这里要用三层循环

    i:i个人(1-k)

    j:j本书(1-m)

    l:第i个人分到l本书(1到j-1)

    dp[i][j]=min(dp[i][j],max(dp[i-1][j],sum[j]-sum[l]))

    sum为前缀和

    当然后面要用贪心求范围

    因为他要求最前面的分的最少

    那么从后面开始分,只要不超过最大值(dp[k][n])就继续分,直到塞不下了再分给下一个

     1 #include<iostream>
     2 using namespace std;
     3 int sum[513];
     4 int ans[513];
     5 int n,k;
     6 int dp[513][513];
     7 void px(int i,int j)
     8 {
     9     if(j==0)
    10     {
    11         return ;
    12     }
    13     if(j==1)
    14     {
    15         cout<<1<<" "<<i<<endl;
    16         return;
    17     }
    18     int a=i,b=sum[i];
    19     while(b+sum[a-1]<=dp[k][n])
    20     {
    21         b=b+sum[a-1];
    22         a--;
    23     }
    24     px(a-1,j-1);
    25     cout<<a<<" "<<i<<endl;
    26     return;
    27 }
    28 int main()
    29 {
    30     //freopen("machine.in","r",stdin);
    31     //freopen("machine.out","w",stdout);
    32     cin>>n>>k;    
    33     for(int i=1;i<=500;i++)
    34     {
    35         for(int j=1;j<=500;j++)
    36         {
    37             dp[i][j]=10000000;
    38         }
    39     }
    40     for(int i=1;i<=n;i++)
    41     {
    42         scanf("%d",&sum[i]);
    43         ans[i]=ans[i-1]+sum[i];
    44         dp[1][i]=ans[i];
    45     }
    46     for(int i=2;i<=k;i++)
    47     {
    48         for(int j=1;j<=n;j++)
    49         {
    50             for(int l=1;l<=j-1;l++)
    51             {
    52                 dp[i][j]=min(dp[i][j],max(dp[i-1][l],ans[j]-ans[l]));
    53             }
    54         }
    55     }
    56     px(n,k);
    57 }

    emmmmmmmm......这样对最后一个是不是不太公平?

    在暴风雨中低着头,是为了不让雨水模糊风雨后眼中的彩虹

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/DK-F/p/9510879.html
Copyright © 2011-2022 走看看