| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
ft : 下到的官方数据都过了; 用随机生成的1000组各种极端数据与ac了的程序做结果fc也全相同; 怎么还是wa呢?有兴趣的拿去测下, 管理员 啊,帮看看
#include <iostream>
using namespace std;
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define nMAX 505
#define INT64_MAX ((__int64(1))<<62)
int n, m, k;
int books[nMAX];
__int64 sum[nMAX];
__int64 f[nMAX][nMAX];
int c[nMAX];
__int64 dp(int m, int k)
// 前k名员工复制前m本书所需最小时间
{
if( f[m][k] != -1 ) return f[m][k];
if( k == 1 ) return sum[m];
f[m][k] = INT64_MAX;
int t;
__int64 v;
for(t=k-1; t<m; t++) {
v = MAX( dp(t, k-1), sum[m] - sum[t] );
if( v < f[m][k] )
f[m][k] = v;
}
return f[m][k];
}
void solve(int m, int k)
{
dp(m, k);
const __int64 cost = f[m][k];
__int64 t = 0;
int index = k - 1;
for(int i=m; i>=1; i--){
if( t + (__int64)books[i] <= cost && i > index ) {
t += (__int64)books[i];
}
else{
c[index--] = i;
t = (__int64)books[i];
}
}
}
void outPut()
{
int i, index = 1;
for(i=1; i<m; i++){
printf("%d ", books[i]);
if( i == c[index] ){
printf("/ ");
index++;
}
}
printf("%d\n", books[m]);
}
int main()
{
scanf("%d", &n);
int i, j;
for (i=0; i<n; i++)
{
memset(f, -1, sizeof(f));
memset(c, 0, sizeof(c));
scanf("%d%d", &m, &k);
for(j=1; j<=m; j++)
scanf("%d", &books[j]);
sum[1] = (__int64)books[1];
for(j=2; j<=m; j++)
sum[j] = sum[j-1] + (__int64)books[j];
solve(m, k);
outPut();
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator