state:
dp[i] - minimum lectures overlaps i topics
transition:
dp[i]=min(dp[j]+1), for all 0<j<i and L-(t[i]-t[j])>0
L-(t[i]-t[j])>0 means time left is enough to overlap t[j] till t[i] only when minimum lectures of two equals shall we consider about minimum DI
state:
dp[i] - minimum DI overlaps i topics
transition:
dp[i]=min(dp[j]+DI(L-(t[i]-t[j])), for all 0<j<i and L-(t[i]-t[j])>0
/* UVas */
/*****************************************************************************/
int n, L, C, c=1;
int t[1001];
int d1[1001];
int d2[1001];
int di(int time) {
return time==0?0:time<=10?-C:(time-10)*(time-10);
}
int main(void) {
while (cin>>n&&n) {
cin>>L>>C;
if (c>1) {
cout<<endl;
}
for (int i=1; i<=n; i++) {
cin>>t[i];
t[i]+=t[i-1];
}
memset(d1, -1, sizeof(d1));
memset(d2, -1, sizeof(d2));
d1[0]=0;
d2[0]=0;
for (int i=1; i<=n; i++) {
for (int j=i-1; j>=0&&t[i]-t[j]<=L; j--) {
int d=di(L-(t[i]-t[j]));
if (d1[i]<0||d1[i]>d1[j]+1) {
d1[i]=d1[j]+1;
d2[i]=d2[j]+d;
}
if (d1[i]==d1[j]+1&&(d2[i]>d2[j]+d||d2[i]==-1)) {
d2[i]=d2[j]+d;
}
}
}
cout<<"Case "<<c<<":"<<endl;
cout<<"Minimum number of lectures: "<<d1[n]<<endl;
cout<<"Total dissatisfaction index: "<<d2[n]<<endl;
c++;
}
return 0;
}
/*****************************************************************************/
No comments :
Post a Comment