码迷,mamicode.com
首页 > 其他好文 > 详细

九度oj 题目1499:项目安排

时间:2016-08-12 23:59:11      阅读:394      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。

 

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是一个整数n(1<=n<=10000):代表小明手中的项目个数。
接下来共有n行,每行有3个整数st、ed、val,分别表示项目的开始、截至时间和项目的报酬,相邻两数之间用空格隔开。
st、ed、value取值均在32位有符号整数(int)的范围内,输入数据保证所有数据的value总和也在int范围内。

 

输出:

对应每个测试案例,输出小明可以获得的最大报酬。

 

样例输入:
3
1 3 6
4 8 9
2 5 16
4
1 14 10
5 20 15
15 20 8
18 22 12
样例输出:
16
22

这个题用动态规划来做,开始采用的dp[],数组下标为时间,但这样做耗时很长,一个示例性的代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define MAX 10002
 6 #define inf 99999999
 7 struct Project
 8 {
 9     int start;
10     int end;
11     int value;
12 };
13 
14 int cmp(const void *a, const void *b) {
15     Project at = *(Project *)a;
16     Project bt = *(Project *)b;
17     return at.end - bt.end;
18 }
19 
20 Project act[MAX];
21 int dp[inf];
22 
23 int main(int argc, char const *argv[])
24 {
25     int n;
26     //freopen("input.txt","r",stdin);
27     while(scanf("%d",&n) != EOF) {
28         int endMax = 0;
29         for(int i = 0; i < n; i++) {
30             scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);
31             if(act[i].end > endMax) {
32                 endMax = act[i].end;
33             }
34         }
35         //qsort(act,n,sizeof(Project),cmp);
36         
37         memset(dp, 0, sizeof(dp));
38         for(int i = 0; i < n; i++) {
39             for(int j = endMax; j >= act[i].end; j--) {
40                 int temp = dp[act[i].start] + act[i].value;
41                 if(dp[j] < temp) {
42                     dp[j] = temp;
43                 }
44             }
45         }
46         printf("%d\n",dp[endMax]);
47     }
48     return 0;
49 }

之后下标的意义改为任务数,代码如下

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <iostream>
 6 #define MAX 10002
 7 
 8 using namespace std;
 9 struct Project
10 {
11     int start;
12     int end;
13     int value;
14 };
15 
16 int cmp(const void *a, const void *b) {
17     Project at = *(Project *)a;
18     Project bt = *(Project *)b;
19     return at.end - bt.end;
20 }
21 
22 Project act[MAX];
23 int dp[MAX];
24 
25 int main(int argc, char const *argv[])
26 {
27     int n;
28     //freopen("input.txt","r",stdin);
29     while(scanf("%d",&n) != EOF) {
30         int endMax = 0;
31         for(int i = 0; i < n; i++) {
32             scanf("%d %d %d",&act[i].start, &act[i].end, &act[i].value);
33             if(act[i].end > endMax) {
34                 endMax = act[i].end;
35             }
36         }
37         qsort(act,n,sizeof(Project),cmp);
38         
39         memset(dp, 0, sizeof(dp));
40         dp[0] = act[0].value;
41 
42         for(int i = 1; i < n; i++) {
43             dp[i] = dp[i-1];
44             for(int j = i-1; j >= 0; j--) {
45                 if(act[j].end <= act[i].start) {
46                     dp[i] = max(dp[i-1], dp[j] + act[i].value);
47                     break;
48                 }
49             }
50             dp[i] = max(dp[i], act[i].value);
51         }
52         printf("%d\n",dp[n-1]);
53     }
54     return 0;
55 }

一开始代码提交错误,是因为没有43行这句话

九度oj 题目1499:项目安排

标签:

原文地址:http://www.cnblogs.com/jasonJie/p/5766892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!