Codeforces 864E Fire(DP)
题目链接 Fire
题意 有n个物品,每个物品的挽救时间代价为ti, 消失时刻为di, 价值为pi。
如果要救某个物品,必须在他消失之前救出来。
同一时刻最多只能救一件物品。
当前耗时为当前已经救出的物品的ti累积。
你需要救出总价值尽可能大的物品,并输出方案。
考虑DP
f[i][j]为考虑前i个物品,获得总价值为j的时候,所用时间的最小值。
c[i][j]为在搜索到第i件物品,当前总价值为j的时候下一步的价值搜索状态。
则有f[i][j] = f[i - 1][j - p[i]] + t[i]
取最大值的时候考虑最大的i满足f[n][i] != INF即可。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 105;
const int Q = 2010; struct node{
int t, d, p;
int id;
friend bool operator < (const node &a, const node &b){
return a.d < b.d;
}
} a[N]; int f[N][Q], c[N][Q];
int n, cnt = 0;
int ans[N]; void solve(int i, int j){
if (i == 0) return;
if (c[i][j] != j) ans[++cnt] = a[i].id;
solve(i - 1, c[i][j]);
} int main(){ scanf("%d", &n);
rep(i, 1, n){
scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].p);
a[i].id = i;
} sort(a + 1, a + n + 1); rep(i, 0, n) rep(j, 0, 2001) f[i][j] = 1 << 30;
f[0][0] = 0;
rep(i, 1, n){
rep(j, 0, 2000){
f[i][j] = f[i - 1][j];
c[i][j] = j;
if (j < a[i].p) continue;
int now = f[i - 1][j - a[i].p] + a[i].t;
if (now < f[i][j] && now < a[i].d){
f[i][j] = now;
c[i][j] = j - a[i].p;
}
}
} dec(i, 2000, 0) if (f[n][i] < (1 << 30)){
printf("%d\n", i);
solve(n, i);
printf("%d\n", cnt);
dec(j, cnt, 1) printf("%d ", ans[j]);
putchar(10);
break;
} return 0;
}
Codeforces 864E Fire(DP)的更多相关文章
- Codeforces 864E Fire(背包DP)
背包DP,决策的时候记一下 jc[i][j]=1 表示第i个物品容量为j的时候要选,输出方案的时候倒推就好了 #include<iostream> #include<cstdlib& ...
- codeforces Educational Codeforces Round 16-E(DP)
题目链接:http://codeforces.com/contest/710/problem/E 题意:开始文本为空,可以选择话费时间x输入或删除一个字符,也可以选择复制并粘贴一串字符(即长度变为两倍 ...
- Codeforces 1110D Jongmah (DP)
题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 解析:首先我们容易发现,我们 ...
- Codeforces 837D--Round Subset (DP)
原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
随机推荐
- css--背景和列表
背景 背景样式: background-color 设置元素的背景颜色 background-image 把图像设置为背景 background-repeat 设置背景图像是否重复及如 ...
- Bootstrap历练实例:表单控件状态(禁用)
禁用的输入框 input 如果您想要禁用一个输入框 input,只需要简单地添加 disabled 属性,这不仅会禁用输入框,还会改变输入框的样式以及当鼠标的指针悬停在元素上时鼠标指针的样式. < ...
- 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link
Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...
- c++ 递归求一个数的阶乘
#include <iostream> using namespace std; long factorial(int value); int main() { int value; co ...
- PAT 乙级 1008
题目 题目地址:PAT 乙级 1008 思路 本题需要注意的一点是当 m > n 的时候会出现逻辑性的错误,需要在 m > n 情况下对m做模运算,即 m % n 代码 #include ...
- PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件
又是一天时间(又没做大作业).今天的心路历程:(1)前端后端怎么连接?(2)后端数据库插数据(3)完全没用上之前的字典反查法(4)突然发现面向对象编程其实很好用,甚至越用越上瘾(5)QLineEdit ...
- (原)剑指offer跳台阶和矩形覆盖
跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析同样为斐波那契数列边形这样的题肯定有公式 设 ...
- python中map()函数的用法讲解
map函数的原型是map(function, iterable, -),它的返回结果是一个列表. 参数function传的是一个函数名,可以是python内置的,也可以是自定义的. 参数iterabl ...
- Python Jquery学习
jquery调用方法: $(css的选择器).操作函数 语法格式: 操作函数: html 修改内容 点击button键后,jquery就会变为bootstrap 当然里面也可以进行判断,实现 ...
- sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误。(provider:命名管道提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233) 然后再连接:错误:18456
问题:sql server 2008启动时:已成功与服务器建立连接,但是在登录过程中发生错误.(provider:命名管道提供程序,error:0-管道的另一端上无任何进程.)(Microsoft S ...