UVA - 607 Scheduling Lectures

题意:给你n个课题,在给你L,C,代表一堂课的时间和一个常数,还有每个课题的时间,要求课题的顺序必须是严格的从小到大就是Ni必须在Ni+1后上,课题必须严格的在一堂课上, 同时,如果在每堂课的最后如果能留有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值