题意:给你n个课题,在给你L,C,代表一堂课的时间和一个常数,还有每个课题的时间,要求课题的顺序必须是严格的从小到大就是Ni必须在Ni+1后上,课题必须严格的在一堂课上,
同时,如果在每堂课的最后如果能留有10分钟以内的时候,那么学生的不满意程序是最小的。不满意程度的计算如下所示:
D=0(如果剩下的时间是0)。
D=-c(如果剩下的时间在10分钟以内)。
D=0(如果剩下的时间是0)。
D=-c(如果剩下的时间在10分钟以内)。
D=(t-10)^2(剩下的情况) 。求安排完所有的课题需要几节课,并让不满意的程度尽量小,用num[i]代表前i个课题的最少课是多少,Cost[i]表示前i个课题的不满意程度,贪心最少的课数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
const int INF = 1<<30;
int n,L,C,num[MAXN],Cost[MAXN],s[MAXN];
int getCost(int a){
if (a == 0)
return 0;
if (a >= 1 && a <= 10)
return -C;
return (a-10)*(a-10);
}
int main(){
int cas = 0;
while (scanf("%d",&n) != EOF && n){
scanf("%d%d",&L,&C);
memset(num,0,sizeof(num));
memset(Cost,0,sizeof(Cost));
memset(s,0,sizeof(s));
int x;
for (int i = 1; i <= n; i++){
scanf("%d",&x);
s[i] = s[i-1] + x;
num[i] = Cost[i] = INF;
for (int j = 0; j < i; j++){ //j从0开始便包括了i课题自己一节课的可能
if ((L-s[i]+s[j]) >= 0){
int ans = getCost(L-s[i]+s[j]);
if (num[j] + 1 < num[i]){
num[i] = num[j] + 1;
Cost[i] = Cost[j] + ans;
}
else if (num[j] + 1 == num[i])
Cost[i] = min(Cost[i],Cost[j]+ans);
}
}
}
if (cas)
printf("\n");
printf("Case %d:\nMinimum number of lectures: %d\n", ++cas, num[n]);
printf("Total dissatisfaction index: %d\n", Cost[n]);
}
return 0;
}