标签:
Description
You are teaching a course and must cover n ( ) topics. The length of each lecture is L ( ) minutes. The topics require ( ) minutes each. For each topic, you must decide in which lecture it should be covered. There are two scheduling restrictions:
With the above restrictions, it is sometimes necessary to have free time at the end of a lecture. If the amount of free time is at most 10 minutes, the students will be happy to leave early. However, if the amount of free time is more, they would feel that their tuition fees are wasted. Therefore, we will model the dissatisfaction index (DI) of a lecture by the formula:
where C is a positive integer, and t is the amount of free time at the end of a lecture. The total dissatisfaction index is the sum of the DI for each lecture.
For this problem, you must find the minimum number of lectures that is needed to satisfy the above constraints. If there are multiple lecture schedules with the minimum number of lectures, also minimize the total dissatisfaction index.
6 30 15 10 10 10 10 10 10 10 120 10 80 80 10 50 30 20 40 30 120 100 0
Case 1: Minimum number of lectures: 2 Total dissatisfaction index: 0 Case 2: Minimum number of lectures: 6 Total dissatisfaction index: 2700
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 const int inf=0x3f3f3f3f; 7 8 int n,l,c; 9 int i,j,k; 10 int cas=1,ans; 11 int a[1005],sum[1005],dp[1005][1005]; 12 13 int dissatisfaction(int x) 14 { 15 if(x==0) 16 return 0; 17 else if(1<=x && x<=10) 18 return (-c); 19 else 20 return (x-10)*(x-10); 21 22 } 23 24 int main() 25 { 26 27 while(scanf("%d",&n)!=EOF && n!=0) 28 { 29 sum[0]=0; 30 scanf("%d %d",&l,&c); 31 for(i=1;i<=n;i++) 32 { 33 scanf("%d",&a[i]); 34 sum[i]=sum[i-1]+a[i]; 35 } 36 for(i=0;i<=n;i++) 37 { 38 dp[i][0]=0; 39 for(j=1;j<=n;j++) 40 dp[i][j]=inf; 41 } 42 43 for(i=1;dp[i-1][n]==inf;i++) 44 { 45 for(j=i;j<=n && sum[j]<=i*l;j++) 46 { 47 for(k=j;k>=i-1;k--) 48 { 49 if(dp[i-1][k]!=inf && (sum[j]-sum[k])<=l) 50 dp[i][j]=min(dp[i][j],dp[i-1][k]+dissatisfaction(l-sum[j]+sum[k])); 51 else if(sum[j]-sum[k]>l) 52 break; 53 } 54 } 55 } 56 57 for(i=1;i<=n;i++) 58 { 59 if(dp[i][n]!=inf) 60 { 61 ans=i; 62 break; 63 } 64 } 65 if(cas>1) 66 printf("\n"); 67 printf("Case %d:\nMinimum number of lectures: %d\nTotal dissatisfaction index: %d\n",cas++,ans,dp[ans][n]); 68 } 69 return 0; 70 }
UVA 607 二十二 Scheduling Lectures
标签:
原文地址:http://www.cnblogs.com/cyd308/p/4771624.html