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 ...
随机推荐
- linux source命令与export命令的区别
shell与export命令 用户登录到Linux系统后,系统将启动一个用户shell.在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序.运行shell脚本程序 ...
- 数据结构之B进制(确定进制)
#include <cstdio> int max_num(int n) { int max=0; while(n) { int k=n%10; if(k>max) max=k; n ...
- 一语惊醒梦中人-《Before I Fall》
I still remembered I turned my attention to the title when I browsed in news by cellphone.I saw the ...
- Javascript的内容摘要
JS简介和变量 {JS的三种方式} 1 HTML中内嵌JS(不提倡使用) <button onclick="javascript:alert ...
- Docker 集群环境实现的新方式
近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...
- ZXing生成条形码、二维码、带logo二维码
采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository <!-- https://mvnrepository.com/art ...
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...
- Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)
说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...
- React——state
在React--组件中介绍过组件有两种定义方式:函数形式以及类形式.但是要想在组件中使用state,就必须使用类形式定义组件. 组件中的state是组件私有的,完全由组件自己控制. 使用类形式定义一个 ...
- 团队作业4——第一次项目冲刺 SeCOnd DaY
项目冲刺--Double Kill 喂喂喂,你好你好,听得见吗?这里是天霸动霸.tua广播站,我是主播小学生¥-¥ 第一次敏捷冲刺平稳的度过了第一天,第一天的任务大家也圆满完成啦[拍手庆祝],那么今天 ...