Codeforces Round #436 (Div. 2)E.Fire
来源:互联网 发布:王俊凯人品知乎 编辑:程序博客网 时间:2024/06/05 14:34
题目链接
题意是有一个人着火了,有n个物品,每个物品有一个价值p,有一个d代表必须在<d之前的时间里把这个东西救出来才有效,有一个t代表救该物品需要用的时间,问你说最后能够获得的最大价值是多少,同时按救援顺序输出救了哪些东西。
如果不考虑物品的deadline的话,我们就直接做一个背包记录一下路径即可,但是考虑到物品救援有先后顺序,我们发现如果两个物品的d一样的话,那么先后救哪个都一样。如果d小的那一个,我们优先把d小的救了肯定没错。所以我们可以把物品对d排一个序,然后做一个背包dp,同时记录一下路径。
#include<bits/stdc++.h>using namespace std;#define LONG long longconst 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-10struct 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[n].d = b ; node[n].p = c; node[n].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[n][j].val) ans = dp[n][j].val , pp = j ; printf("%d\n",ans ) ; printf("%d\n",dp[n][pp].vv.size()) ; for(int i = 0 ; i< dp[n][pp].vv.size() ; ++ i) printf("%d ",dp[n][pp].vv[i]);cout<<endl ; } return 0 ;}
阅读全文
1 0
- Codeforces Round #436 (Div. 2) E. Fire
- Codeforces Round #436 (Div. 2)E.Fire
- Codeforces Round #436 (Div. 2)E. Fire
- Codeforces Round #436 (Div. 2) E. Fire
- Codeforces Round #436 (Div. 2) E fire DP
- Codeforces Round #436 (Div. 2) 864E. Fire
- Codeforces 864E (Codeforces Round #436 (Div. 2)) E. Fire 背包输出路径
- Codeforces Round #436 E. Fire
- Codeforces Round #436 (Div. 2) Fire
- Codeforces Round #436 (Div. 2)-E-Fire(01背包输出路径)
- Codeforces Round #436 (Div. 2) E. Fire(背包DP+输出路径)
- Codeforces Round #436 (Div. 2) E. Fire(01背包+输出路径)
- Codeforces Round #436 (Div. 2)-背包&排序&输出状态-E. Fire
- Codeforces Round #436 (Div. 2) E. Fire (有放入顺序有关的01背包)
- 【01背包 && 记录路径 && 约束】Codeforces Round #436 (Div. 2) E. Fire
- Codeforces Round #436 (Div. 2) E
- Codeforces Round #436 E.Fire(01背包 + 输出路径)
- Codeforces Round #436 (Div. 2)E,F详解
- c++类的嵌套定义
- java stringbuffer stringbuilder
- ZBUS = MQ + RPC
- SpringMVC_@RequestBody
- CustomValidator
- Codeforces Round #436 (Div. 2)E.Fire
- 动态规划算法求解0-1背包问题
- android中判断包含某class,so文件
- Chrlea基本功能点总结
- 位操作
- javascript的格式匹配认证
- Photon_PhotonServer的启动及项目的启动_010
- git 基础以及常见错误
- 2017年的数学建模比赛已经结束了