// UVa 607 - Scheduling Lectures
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int L, C;
int D(int lect) {
int t = L - lect;
if (t == 0)
return 0;
if (t <= 10)
return -C;
else
return (t - 10) * (t - 10);
}
int main() {
int cases = 0;
int n;
cin >> n;
while (n) {
cases++;
cin >> L >> C;
int lectures = 1;
int current_lecture = 0;
int topic[1001];
for (int i = 1; i <= n; i++) {
cin >> topic[i];
if (topic[i] + current_lecture <= L)
current_lecture += topic[i];
else {
current_lecture = topic[i];
lectures++;
}
}
if (cases > 1)
printf("\n");
printf("Case %d:\n", cases);
printf("Minimum number of lectures: %d\n", lectures);
signed long long int T[2][1001];
memset(T, 127, sizeof(T));
signed long long int oo = T[0][0];
// base cases
current_lecture = 0;
topic[0] = 0;
for (int i = 0; i <= n; i++) {
current_lecture += topic[i];
if (current_lecture > L)
break;
T[1][i] = D(current_lecture);
}
// calculate total disatisfaction index
for (int ll = 2; ll <= lectures; ll++) {
int l = ll % 2;
T[l][0] = D(0) * ll;
for (int i = ll; i <= n; i++) {
T[l][i] = oo;
current_lecture = 0;
for (int j = i; j >= ll; j--) {
current_lecture += topic[j];
if (current_lecture > L)
break;
else {
if (T[(l + 1) % 2][j - 1] != oo && T[l][i] > T[(l + 1) % 2][j - 1] + D(current_lecture))
T[l][i] = T[(l + 1) % 2][j - 1] + D(current_lecture);
}
}
}
}
printf("Total dissatisfaction index: %lld\n", T[lectures % 2][n]);
cin >> n;
}
return 0;
}
Thursday, June 11, 2015
UVa 607 - Scheduling Lectures
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment