书的复制书的复制 书 的 复 制
Description
现在要把m本有顺序的书分给k个人复制(抄写),每个人的抄写速度都一样,一本书不允许分给两个或两个以上的人抄写,分给每个人的书,必须是连续的,比如不能把第一、第三、第四本书给同一个人抄写。
现在请你设计一种方案,使得复制时间最短。复制时间为抄写最多的人用去的时间。
Input
第一行两个整数,m,k(k<=m<=500)
第二行为m个整数,第i个数表示第i本书的页数。
Output
最短时间
Sample Input
9 3
1 2 3 4 5 6 7 8 9
Sample Output
17
题目大意:
用n本书,每本书都有自己的页数(抄一页要一个单位的时间),每个人抄的必须是连续的,而且不能把书给两个人抄,最快多久抄完?
解题方法:
动态转移方程:
f[i][k]=min(f[i][k],max(f[j][k−1],a[i]−a[j]))f[i][k]=min(f[i][k],max(f[j][k-1],a[i]-a[j])) f [ i ] [ k ] = m i n ( f [ i ] [ k ] , m a x ( f [ j ] [ k − 1 ] , a [ i ] − a [ j ] ) )
标注:
i为求前i本书,k为k个人,j为分割线
#include <cstdio>
#include <iostream>
using namespace std;
int n, m, x, a[ 502 ] , f[ 502 ] [ 502 ] ;
int main ( )
{ memset ( f, 127 / 3 , sizeof ( f) ) ; scanf ( "%d%d" , & n, & m) ; for ( int i= 1 ; i<= n; i++ ) { scanf ( "%d" , & x) ; a[ i] = a[ i- 1 ] + x; f[ i] [ 1 ] = a[ i] ; } for ( int k= 2 ; k<= m; k++ ) for ( int i= k; i<= n- m+ k; i++ ) for ( int j= 1 ; j< i; j++ ) f[ i] [ k] = min ( f[ i] [ k] , max ( f[ j] [ k- 1 ] , a[ i] - a[ j] ) ) ; printf ( "%d" , f[ n] [ m] ) ;
}