您的位置:首页 > 其它

uva 607 Scheduling Lectures

2015-09-09 18:13 411 查看
你在一所学校教书,每节课时长L,你有n个主题必须要讲完,每个主题时常为ti。
有两个限制:1,每个主题只能在一节课内讲完,不能分开在多节课;2,必须按主题顺序讲,不能打乱。
对于每节课,讲完主题的内容会剩下时间t,如果t>10,会产生不满意度(t-10)^2,如果 1<=t<=10, 学生很高兴,所以产生不满意度是负数的-C,如果t=0, 那么不满意度为0.
问讲完所有主题,最少要用多少节课?如果有多种方案,要求不满意度最低。
num[i]表示讲完第i个主题,所用的最少节课
dp[i]表示讲完i个主题,用了num[i]节课的最低不满意度

// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.

#include"iostream"
#include"cstdio"
#include"cstdlib"
#include"cstring"
#include"climits"
#include"queue"
#include"cmath"
#include"map"
#include"set"
#include"stack"
#include"vector"
#include"sstream"
#include"algorithm"
using namespace std;
typedef long long ll;
const int inf=2e9;
int n,l,c;
int sum[1010];
int num[1010],dp[1010];
int penalty(int x)
{
if(x==0)
return 0;
else if(x>=1&&x<=10)
return -c;
else
return (x-10)*(x-10);
}
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int Case=0;
while(scanf("%d",&n)&&n)
{
if(Case)
cout<<endl;
Case++;
cout<<"Case "<<Case<<':'<<endl;
scanf("%d%d",&l,&c);
sum[0]=0;
int tmp;
for(int i=1;i<=n;i++)
scanf("%d",&tmp),sum[i]=sum[i-1]+tmp;
num[0]=dp[0]=0;
for(int i=1;i<=n;i++)
{
num[i]=dp[i]=inf;
for(int j=0;j<i;j++)
if(l>=sum[i]-sum[j])
{
if(num[i]>num[j]+1)
{
num[i]=num[j]+1;
dp[i]=dp[j]+penalty(l-(sum[i]-sum[j]));
}
else if(num[i]==num[j]+1)
if(dp[i]>dp[j]+penalty(l-(sum[i]-sum[j])))
dp[i]=dp[j]+penalty(l-(sum[i]-sum[j]));
}
}
cout<<"Minimum number of lectures: "<<num
<<endl;
cout<<"Total dissatisfaction index: "<<dp
<<endl;

}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: