您的位置:首页 > 其它

uva607

2016-03-05 12:18 411 查看
题意:

有n个主题。每堂课的时间是L。每个主题各要求t1,t2,…tn(1<=ti<=L)。对于每个主题,你要决定要哪堂课教。并且有如下的规则:

1.每个主题必须完整地包含在一堂课里。不能分成两部分教。

2.主题之间的顺序不能调换,即主题i必须在主题i+1之前教。

同时,如果在每堂课的最后如果能留有10分钟以内的时候,那么学生的不满意程序是最小的。不满意程度的计算如下所示:

D=0(如果剩下的时间是0)。

D=-c(如果剩下的时间在10分钟以内)。

D=(t-10)^2(剩下的情况)

思路:

dp[i, j]表示前i节课,覆盖j个知识点的最小不满意度。

贪心 + dp

代码:

#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>

const int INF= 0x7ffffff;
int n,L,C;
int topic[1005];
int dp[1005][1005];
int sum[1005];
int value(int k) {
int t = L - k;

if(t == 0)
return 0;
else if(t > 0 && t <= 10)
return  -1 * C;
else if(t > 10)
return (t - 10) * (t - 10);
}
int main() {
int T = 0;
while(scanf("%d",&n) &&n) {
scanf("%d %d",&L,&C);
sum[0] = 0;
for(int i = 1; i <= n; i++)  {
scanf("%d",&topic[i]);
sum[i] = sum[i - 1] + topic[i];
}
for(int i = 0; i <= n; i++) {
dp[i][0] = 0;
for(int j = 1; j <= n; j++)
dp[i][j] =  INF;
}

for(int i = 1; dp[i - 1]
== INF; i++) {
for(int j = i; j <= n && sum[j] <= i * L;j++) {
for(int k = j; k >= i - 1; k--) {
if(sum[j] - sum[k] <= L && dp[i - 1][k] != INF)
dp[i][j] = min(dp[i][j],dp[i - 1][k] + value(sum[j] - sum[k]));
else if(sum[j] - sum[k] > L)
break;

}
}
}
int i;
for( i = 1; i <= n; i++)
if(dp[i]
!= INF)
break;
if(T)
printf("\n");
printf("Case %d:\n",++T);
printf("Minimum number of lectures: %d\n",i);
printf("Total dissatisfaction index: %d\n",dp[i]
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: