Codeforces Round #436 (Div. 2) E. Fire
http://codeforces.com/contest/864/problem/E
题意:
有一堆物品,每个物品有3个属性,需要的时间,失效的时间(一开始)和价值。只能一件一件的选择物品(即在选择这件物品时需要一定的时间,在这段时间之内不能选择其他物品),选择这件物品只能在失效时间之前选择。问选择的最大价值是多少。
思路:
对于每一个物品,有选和不选两种操作,与01背包是相似的。但是此题选择的顺序会影响到结果,这是01背包不同的地方。
比如 a.st = 3,a.en = 5,a.v = 4
b.st = 4,b.en = 8,b.v = 5
这组数据先选择a,再选择b符合条件,价值最大,但是如果先选择b,那么a就没得选了,所以我们需要按照一定的顺序来选择。
那么通过这个例子可以直观的感受到我们按结束时间排序之后进行选择得到的结果是最优的。
背包的时候,把时间当作体积V,然后滚动数组优化时间就得逆序枚举,时间必须是失效时间-1(因为是在失效时间按之前),然巧妙的用一个vector来保存物品的编号就可以了。
代码:
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std; struct node
{
int s,e,v;
int id; void read(void)
{
scanf("%d%d%d",&s,&e,&v);
}
} a[]; bool cmp(node aa,node bb)
{
return aa.e < bb.e;
} int dp[];
vector<int> g[]; int main()
{
int n; scanf("%d",&n); for (int i = ;i <= n;i++)
a[i].read(),a[i].id = i; sort(a+,a+n+,cmp); for (int i = ;i <= n;i++)
{
for (int j = a[i].e - ;j >= a[i].s;j--)
{
if (dp[j] < dp[j-a[i].s] + a[i].v)
{
dp[j] = dp[j-a[i].s] + a[i].v; g[j].clear(); for (int k = ;k < g[j-a[i].s].size();k++)
g[j].push_back(g[j-a[i].s][k]); g[j].push_back(a[i].id);
}
}
} int ans = ,id = ; for (int i = ;i <= a[n].e;i++)
{
if (dp[i] > ans)
{
ans = dp[i];
id = i;
}
} printf("%d\n",ans);
printf("%d\n",g[id].size()); for (int i = ;i < g[id].size();i++)
{
if (!i) printf("%d",g[id][i]);
else printf(" %d",g[id][i]);
} return ;
}
Codeforces Round #436 (Div. 2) E. Fire的更多相关文章
- Codeforces Round #436 (Div. 2) E. Fire(dp 记录路径)
E. Fire time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- Codeforces Round #436 (Div. 2) E. Fire(背包+记录路径)
传送门 题意 给出n种物品,抢救第\(i\)种物品花费时间\(t_i\),价值\(p_i\),截止时间\(d_i\) 询问抢救的顺序及物品价值和最大值 分析 按\(d_i\)排序的目的是防止以下情况 ...
- Codeforces Round #436 (Div. 2)【A、B、C、D、E】
Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...
- Codeforces Round #436 (Div. 2) C. Bus
http://codeforces.com/contest/864/problem/C 题意: 坐标轴上有x = 0和 x = a两点,汽车从0到a之后掉头返回,从a到0之后又掉头驶向a...从0到a ...
- Codeforces Round #436 (Div. 2)
http://codeforces.com/contest/864 第一次打cf的月赛-- A 题意:给你一个数列,问你能不能保证里面只有两种数且个数相等.2<=n<=100,1<= ...
- Codeforces Round #436 (Div. 2) D. Make a Permutation!
http://codeforces.com/contest/864/problem/D 题意: 给出n和n个数(ai <= n),要求改变其中某些数,使得这n个数为1到n的一个排列,首先保证修改 ...
- Codeforces Round #436 (Div. 2) B. Polycarp and Letters
http://codeforces.com/contest/864/problem/B 题意: 给出一个字符串,要求找到一个集合S,使得从S中选出的所有数,在这些数的位置上的字母全部为小写且是不同的字 ...
- Codeforces Round #436 (Div. 2)D. Make a Permutation! 模拟
D. Make a Permutation! time limit per test: 2 seconds memory limit per test: 256 megabytes input: st ...
- Codeforces Round #436 (Div. 2)C. Bus 模拟
C. Bus time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input out ...
随机推荐
- java web开发时的绝对路径与相对路径
相对路径 不以/开头的路径为相对路径,使用相对路径时的路径为当前访问的文件的父目录,即如果现在访问文件的路径为http://localhost:8080/项目名/目录/文件,那么使用相对路径时路径前缀 ...
- redis 安装及启动关闭
1.redis下载 方式1:直接去官网下载 https://redis.io/download 方式2:通过命令下载 wget http://download.redis.io/releases/re ...
- Jsp/html页面删除前进行删除提示
HTML代码 <body> <a href="javascript:if(window.confirm('是否?')){window.location.href='test ...
- amoeba
Amoeba 原理:amoeba相当于业务员,处理client的读写请求,并将读写请求分开处理.amoeba和master以及slave都有联系,如果是读的请求,amoeba就从slave读取信息反馈 ...
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
spring boot / cloud (八) 使用RestTemplate来构建远程调用服务 前言 上周因家里突发急事,请假一周,故博客没有正常更新 RestTemplate介绍: RestTemp ...
- 常用的十大Python开发工具
据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉 ...
- jmeter后置处理器 JSON Extractor取多个变量值
1.需要获取响应数据的请求右键添加-后置处理器-JSON Extractor 2.如果要获取json响应数据多个值时,设置的Variable names (后续引用变量值的变量名设置)与JSON Pa ...
- 【JavaScript基础系列】决定你的人生能走多远的,是基础。
前言 javaScript门槛非常低,一点语法,一个dom,一个bom就可以使用它开发大部分js应用,再加上现在层出不穷的框架极大的简化抽象了javaScript的使用方式,但是我们始终不能忘记的一点 ...
- 安卓两个build.gradle的区别
作为安卓入门选手,在导入第三方的时候才发现居然有两个build.gradle,我说咋不对啊,原来是导错了(可能是因为我没有看安卓培训的视频吧). 那么就说一下这两个的作用(一个Project的,一个M ...
- poj 3648 2-SAT建图+topsort输出结果
其实2-SAT类型题目的类型比较明确,基本模型差不多是对于n组对称的点,通过给出的限制条件建图连边,然后通过缩点和判断冲突来解决问题.要注意的是在topsort输出结果的时候,缩点后建图需要反向连边, ...