UVA607
2015-10-29 22:01
417 查看
/* 题意: 每节课的长度为 L,有N个主题,讲每个主题的时间分别是 t1,t2,t3..., 每个主题必须在一节课讲完,不能分两节课。每节课上完有不满意度。 求最小不满意度。 */ #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; int sum[1010],l,c; int a[1010]; int dp[1010][1010]; int get(int t) { int x=l-t; if(x==0) return 0; if(x>=1 && x<=10) return -c; else if(x>10) return (x-10)*(x-10); } int main() { int n,cnt=0; while(scanf("%d",&n)!=EOF && n) { scanf("%d%d",&l,&c); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i] = sum[i-1] + a[i]; } memset(dp,INF,sizeof(dp)); for(int i=0;i<=n;i++) dp[i][0]=0; for(int i=1;dp[i-1] ==INF;i++) { for(int j=i;j<=n && sum[j]<=i*l ;j++) { for(int k=j;k>=i-1;--k) { if(sum[j]-sum[k]<=l && dp[i-1][k] !=INF) dp[i][j] = min(dp[i][j],dp[i-1][k] + get(sum[j]-sum[k])); else if(sum[j]-sum[k] > l) break; } } } int i; for (i = 1; i <= n; ++i) if (dp[i] != INF) break; if (cnt) printf("\n"); printf("Case %d:\n", ++cnt); printf("Minimum number of lectures: %d\n", i); printf("Total dissatisfaction index: %d\n", dp[i] ); } return 0; }
相关文章推荐
- C Looooops(扩展欧几里德)
- POJ1163 The Triangle
- hdu2535 Vote
- linux笔记:文件处理命令touch,cat,more,less,head,tail
- 为什么要使用包导入?
- postgresql如果查询出的数据为空,则设为0的方法
- 你不知道的JavaScript--Item23 定时器的合理使用
- 静态路由中的递归路由原理与冗余备份链路的实现
- POJ Power Network (dinic)
- Android中显示意图和隐式意图
- 【FFmpeg】FFmpeg常用基本命令
- Java jdk配置
- 你不知道的JavaScript--Item23 定时器的合理使用
- Java鼠标监听(单击、双击、滑轮)
- Java 工程结构管理 Build Path
- 表达式的后缀表达式
- POJ 2752 Seek the Name, Seek the Fame (kmp)
- IOS股票App,股精灵
- 有趣的数学--Catalan Number
- Activity的生命周期