http://www.acmerblog.com/offer-163-1171.html
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
这里按结束的时间先排序。(也可以按开始时间排序,遍历的次序需要颠倒一下)
===> there is problem in the code,
小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠)。
这里按结束的时间先排序。(也可以按开始时间排序,遍历的次序需要颠倒一下)
===> there is problem in the code,
04 | int n; |
05 | class P{ |
06 | public : |
07 | int st,ed,value; |
08 | }; |
09 | P p[10001]; |
10 | int dp[10001]; //dp[i]安排前i个项目,最多能到得到的最大value |
11 | bool cmp( const P & p1, const P & p2){ |
12 | return p1.ed < p2.ed; |
13 | } |
14 |
15 | int main(){ |
16 | int n, i, j; |
17 | //freopen("in.txt", "r", stdin); |
18 | while ( scanf ( "%d" , &n) != EOF){ |
19 | for (i=1; i<=n; i++){ |
20 | scanf ( "%d %d %d" , &p[i].st, &p[i].ed, &p[i].value); |
21 | dp[i] = 0; |
22 | } |
23 | sort(p+1, p+n+1, cmp); //按结束时间排序是重点 |
24 | dp[0] = 0; |
25 | for (i=1; i<=n; i++){ |
26 |
27 | //查找最的j,可满足当前的i。都不满足就j=0 |
28 | for (j=i-1; j>0; j--){ |
29 | if (p[i].st >= p[j].ed) |
30 | break ; |
31 | } |
32 | dp[i] = dp[j] + p[i].value; |
33 | if (dp[i] < dp[i-1]) |
34 | dp[i] = dp[i-1]; |
35 | } |
36 | printf ( "%d\n" ,dp[n]); |
37 | } |
38 | return 0; |
39 | } |
No comments:
Post a Comment