a_beginner

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

题目连接http://poj.org/problem?id=3616

题意:一个奶牛在0~N时间段内可被取奶,每次挤奶以后必须休息至少R分钟才能下次继续挤奶。有M次可以挤奶的时间段,每次取奶对应三个值:开始时间、结束时间、效率值,每次挤奶的过程不能中断。求出最大效率值。

解法:首先按照结束时间从小到大排序(按照结束时间排序方便后边的dp);dp[i]表示第i个挤奶时间段后,效率最大值。

转移方程如下:

初始化:dp[i] = data[i].eff

 

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 2000 + 10;
 8 int N, R, M;
 9 int dp[maxn];
10 struct Node
11 {
12     int ls, re;//开始时间、结束时间
13     int eff;//效率值
14 }data[maxn];
15 
16 bool cmp(Node na, Node nb)
17 {
18     return na.re < nb.re;
19 }
20 int max(int a, int b)
21 {
22     if(a>b)
23         return a;
24     return b;
25 }
26 int main()
27 {
28     while(scanf("%d %d %d",&N, &M, &R)!=EOF)
29     {
30         int i, j;
31         for(i = 0; i < M; i++)
32         {
33             scanf("%d %d %d",&data[i].ls,&data[i].re, &data[i].eff);
34         }
35         sort(data, data + M, cmp);
36         //for(i = 0; i < M; i++)
37          //   printf("%d %d %d\n",data[i].ls, data[i].re, data[i].eff);
38         memset(dp, 0, sizeof(dp));
39         dp[0] = 0;
40         for(i = 0; i < M; i++)
41         {
42             dp[i] = max(dp[i], data[i].eff);
43             for(j = 0; j < i; j++)
44             {
45                 if( data[j].re + R <= data[i].ls )
46                     dp[i] = max(dp[i], dp[j] + data[i].eff);
47                 else
48                     dp[i] = max(dp[i], dp[j]);
49             }
50         }
51         int ans = -1;
52         //for(i = 0; i < M; i++)
53         //    ans = max(ans, dp[i]);
54         printf("%d\n",dp[M-1]);
55     }
56     return 0;
57 }

 

 

posted on 2013-08-05 17:00  a_beginner  阅读(189)  评论(0)    收藏  举报