Uva 607 Scheduling Lectures (Dp+贪心)

                                                                                                                   Scheduling Lectures                                                                          

You are teaching a course and must cover n ( $1 \le n \le 1000$) topics. The length of each lecture is L ( $1 \le L \le 500$) minutes. The topics require $t_1, t_2, \dots, t_n$ ($1 \le t_i \le L$) minutes each. For each topic, you must decide in which lecture it should be covered. There are two scheduling restrictions:

1.
Each topic must be covered in a single lecture. It cannot be divided into two lectures. This reduces discontinuity between lectures.
2.
Topic   i  must be covered before topic   i  + 1 for all   $1 \le i < n$. Otherwise, students may not have the prerequisites to understand topic   i  + 1.

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: 

\begin{displaymath}DI = \cases{0 & if $t=0$, \cr
-C & if $1 \le t \le 10$, \cr
(t-10)^2 & otherwise}
\end{displaymath}

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.

 

Input

The input consists of a number of cases. The first line of each case contains the integer n, or 0 if there are no more cases. The next line contains the integers L and C. These are followed by n integers $t_1, t_2, \dots, t_n$.

Output

For each case, print the case number, the minimum number of lectures used, and the total dissatisfaction index for the corresponding lecture schedule on three separate lines. Output a blank line between cases.

Sample Input

6
30 15
10
10
10
10
10
10
10
120 10
80
80
10
50
30
20
40
30
120
100
0

Sample Output 

Case 1:
Minimum number of lectures: 2
Total dissatisfaction index: 0

Case 2:
Minimum number of lectures: 6
Total dissatisfaction index: 2700


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

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=99999999;
const int maxn=1010;

int sum[maxn],dp[maxn][maxn],a[maxn],n,L,C,cnt,co;

void initial()
{
    for(int i=0; i<maxn; i++)
    {
        dp[i][0]=0;
        for(int j=1; j<maxn; j++)  dp[i][j]=inf;
    }
    cnt=0;
}

void input()
{
    sum[0]=0;
    scanf("%d %d",&L,&C);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
}

void solve1()
{
    int w=0;
    for(int i=1; i<=n; i++)
    {
        w+=a[i];
        if(w>=L)
        {
            cnt++;
            if(w==L) w=0;
            else  w=a[i];
        }
    }
    if(w) cnt++;
}

void solve2()
{
    for(int i=1; i<=cnt; i++)
        for(int j=1; j<=n; j++)
        {
             if(sum[j]>i*L)  break;
             for(int k=j-1;k>=0 && sum[j]-sum[k]<=L;k--)
             {
                  int t=L-(sum[j]-sum[k]),val;
                  if(t==0)   val=0;
                  else if(t>=1 && t<=10)  val=-C;
                  else val=(t-10)*(t-10);
                  dp[i][j]=min(dp[i][j],dp[i-1][k]+val);
             }
        }
    if(co)  printf("\n");
    printf("Case %d:\n",++co);
    printf("Minimum number of lectures: %d\n",cnt);
    printf("Total dissatisfaction index: %d\n",dp[cnt][n]);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)  break;
        initial();
        input();
        solve1();
        solve2();
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值