Codeforces Round #436 (Div. 2)E.Fire
2017-09-26 12:27
513 查看
题目链接
题意是有一个人着火了,有n个物品,每个物品有一个价值p,有一个d代表必须在<d之前的时间里把这个东西救出来才有效,有一个t代表救该物品需要用的时间,问你说最后能够获得的最大价值是多少,同时按救援顺序输出救了哪些东西。
如果不考虑物品的deadline的话,我们就直接做一个背包记录一下路径即可,但是考虑到物品救援有先后顺序,我们发现如果两个物品的d一样的话,那么先后救哪个都一样。如果d小的那一个,我们优先把d小的救了肯定没错。所以我们可以把物品对d排一个序,然后做一个背包dp,同时记录一下路径。
题意是有一个人着火了,有n个物品,每个物品有一个价值p,有一个d代表必须在<d之前的时间里把这个东西救出来才有效,有一个t代表救该物品需要用的时间,问你说最后能够获得的最大价值是多少,同时按救援顺序输出救了哪些东西。
如果不考虑物品的deadline的话,我们就直接做一个背包记录一下路径即可,但是考虑到物品救援有先后顺序,我们发现如果两个物品的d一样的话,那么先后救哪个都一样。如果d小的那一个,我们优先把d小的救了肯定没错。所以我们可以把物品对d排一个序,然后做一个背包dp,同时记录一下路径。
#include<bits/stdc++.h> using namespace std; #define LONG long long const LONG INF=0x3f3f3f3f; const LONG MOD=1e9+ 7; const double PI=acos(-1.0); #define clrI(x) memset(x,-1,sizeof(x)) #define clr0(x) memset(x,0,sizeof x) #define clr1(x) memset(x,INF,sizeof x) #define clr2(x) memset(x,-INF,sizeof x) #define EPS 1e-10 struct Node { int d , t ,p ,id; }node[210]; struct DP { int val ; vector <int>vv ; }dp[115][2100]; bool cmp(Node a , Node b) { if(a.d == b.d ) return a.t < b.t ; return a.d < b.d ; } int main() { int TT ; int a, b ,c; while(cin >> TT) { int n = 0 ; for(int i = 1;i <= TT ; ++ i) { scanf("%d%d%d",&a,&b,&c) ; if(a >= b ) continue ; node[++n].t = a ; node .d = b ; node .p = c; node .id = i ; } for(int i = 0 ; i < 102 ; ++ i) for(int j = 0 ; j <= 2050; ++ j) dp[i][j].val = 0 , dp[i][j].vv.clear() ; sort(node+1 , node + n + 1 ,cmp ) ; for(int i = 1;i <= n ; ++i) for(int j = 0 ; j < node[i].d ; ++ j) { dp[i][j] = dp[i-1][j] ; if( j >= node[i].t ) if(dp[i][j].val < dp[i-1][j-node[i].t].val + node[i].p ) { dp[i][j] = dp[i-1][j-node[i].t] ; dp[i][j].val = dp[i-1][j-node[i].t].val + node[i].p ; dp[i][j].vv.push_back(node[i].id) ; } } int ans = 0 , pp = -1; for(int j = 0 ;j <= 2000 ; ++ j) if(ans < dp [j].val) ans = dp [j].val , pp = j ; printf("%d\n",ans ) ; printf("%d\n",dp [pp].vv.size()) ; for(int i = 0 ; i< dp [pp].vv.size() ; ++ i) printf("%d ",dp [pp].vv[i]);cout<<endl ; } return 0 ; }
相关文章推荐
- Codeforces Round #436 (Div. 2)E. Fire
- Codeforces Round #436 (Div. 2) E. Fire(背包DP+输出路径)
- Codeforces Round #436 (Div. 2)
- Codeforces Round #436 (Div. 2) 做题总结
- Codeforces Round #436 (Div. 2) C. Bus
- Codeforces Round #436 E.Fire(01背包 + 输出路径)
- Codeforces Round #436 (Div. 2)E,F详解
- Codeforces Round #436 (Div. 2)
- Codeforces Round #436 (Div. 2) C. Bus
- Codeforces Round #436 (Div. 2) C. Bus
- Codeforces Round #436 E. Fire
- Codeforces Round #436 (Div. 2) C. Bus 来回路程问题
- Codeforces Round #276 (Div. 2) C
- Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
- Codeforces Round #305 (Div. 2)--A. Mike and Fax
- Codeforces Round #352 (Div. 2) C. Recycling Bottles 暴力+贪心
- Codeforces Round #354 (Div. 2)676D. Theseus and labyrinth
- 【Codeforces Round 274 (Div 2)C】【贪心】Exams a[i]位置写a[i]或b[i] 所有位置的数保证不下降的最早结束时间
- Codeforces Round #368 (Div. 2)
- Codeforces Round #253 (Div. 2) B - Kolya and Tandem Repeat