Codeforces 1203F (贪心, DP)
题意:有n个任务,你的初始rating是m, 这n个任务有两个指标:完成这项任务所需的最低rating(a[i]),以及完成这项任务后rating的变化(可能为负)(b[i])。rating不能为负。F1:问是否存在一种任务完成顺序,始得所有任务都可以被完成,。F2:你可以任意选择一些任务去完成,问最多可以完成多少任务。
思路:
F1: 首先任务分成两部分:涨rating的和降rating的。对于涨rating的任务,直接按照a[i]从小到大排序即可。为什么呢?因为完成rating之后rating一定不会比原来小,即原来能完成的任务在完成其它任务后也一定能完成,如果可以全部完成,就开始考虑降rating的部分。我们考虑一下降rating的部分,我们考虑每一个任务执行之后rating的下界,然后按下界从大到小排序,即优先选择下界大的任务,下界越高对后面的影响越小。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 110;
struct node {
int x, y;
};
vector<node> a, b;
bool cmp1(node t1, node t2) {
return t1.x < t2.x;
}
bool cmp2(node t1, node t2) {
return (max(t1.x, -t1.y) + t1.y) > (max(t2.x, -t2.y) + t2.y);
}
int main() {
int n, m, cnt1 = 0, cnt2 = 0;
scanf("%d%d", &n, &m);
int sum = 0;
node tmp;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &tmp.x, &tmp.y);
if(tmp.y >= 0) a.push_back(tmp);
else b.push_back(tmp);
}
sort(a.begin(), a.end(), cmp1);
sort(b.begin(), b.end(), cmp2);
int ans = 0;
for (int i = 0; i < a.size(); i++) {
if(m < a[i].x) ans = -1;
m += a[i].y;
}
for (int i = 0; i < b.size(); i++) {
if(m < b[i].x) ans = -1;
m += b[i].y;
}
if(ans == -1) printf("NO\n");
else printf("YES\n");
}
F2:很明显这是一个背包DP,但是直接DP是O(n * n * m)的,因为每一个任务的选择会影响后面的任务。这样DP会超时。通过F1的结论我们得知,如果我们把降rating的部分按照下界排序,优先选择上界高的任务,这样我们DP转移时只需枚举当前任务选择还是不选择就行了,因为这种决策是最优的,所以不需再考虑之前完成的任务的影响,这样O(n * m)的复杂度便可完成DP过程。
代码:
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
const int maxn = 600010;
int dp[110][maxn];
bool cmp(pii t1, pii t2) {
return (t1.first + t1.second) > (t2.first + t2.second);
}
vector<pii> a, b;
int main() {
int n, m;
scanf("%d%d", &n, &m);
pii tmp;
for (int i = 1; i <= n; i++) {
scanf("%d%d", &tmp.first, &tmp.second);
if(tmp.second >= 0) a.push_back(tmp);
else b.push_back(tmp);
}
sort(a.begin(), a.end());
sort(b.begin(), b.end(), cmp);
int mx = m, tot = 0;
for (int i = 0; i < a.size(); i++) {
if(a[i].first <= mx) {
mx += a[i].second;
tot++;
}
}
int ans = 0;
dp[0][mx] = tot;
for (int i = 0; i < b.size(); i++) {
for (int j = 0; j <= mx; j++) {
if(j >= b[i].first && j + b[i].second >= 0) {
dp[i + 1][j + b[i].second] = max(dp[i + 1][j + b[i].second], dp[i][j] + 1);
}
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
}
}
for (int i = 0; i <= mx; i++) {
ans = max(ans, dp[b.size()][i]);
}
printf("%d\n", ans);
}
Codeforces 1203F (贪心, DP)的更多相关文章
- 【BZOJ-3174】拯救小矮人 贪心 + DP
3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 686 Solved: 357[Submit][Status ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp
题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...
- 【bzoj3174】[Tjoi2013]拯救小矮人 贪心+dp
题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人,我们知道他从脚 ...
- hdu 1257 最少拦截系统【贪心 || DP——LIS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 贪心+DP【洛谷P4823】 [TJOI2013]拯救小矮人
P4823 [TJOI2013]拯救小矮人 题目描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以 ...
- 贪心+dp
贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...
- 【题解】CF1056F Write the Contest(三分+贪心+DP)
[题解]CF1056F Write the Contest(三分+贪心+DP) 最优化问题的三个解决方法都套在一个题里了,真牛逼 最优解应该是怎样的,一定存在一种最优解是先完成了耗时长的任务再干别的( ...
随机推荐
- Sass Maps的函数-map-values($map)、map-merge($map1,$map2)
map-values($map) map-values($map) 函数类似于 map-keys($map) 功能,不同的是 map-values($map )获取的是 $map 的所有 value ...
- webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理
Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...
- call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
<?php function foobar($arg, $arg2) { echo __FUNCTION__, " got $arg and $arg2\n"; } clas ...
- Spring---条件注解@Conditional
1.概述 1.1.Spring4 提供了一个更通用的 基于条件的Bean的创建,即使用@Conditional注解: 1.2.案例 package com.an.config; import co ...
- 输出匹配项:grep
命令格式: grep pattern [file...] When grep encounters a "pattern" in the file, it prints out t ...
- python-字符、字符串、函数处理
1.列表元祖字典集合 列表 list = ["a", "b", "c", "d"] 元祖 tup = (1, 2, 3, ...
- [CF1161F]Zigzag Game
通过这道模板题学了一种新的模型,记录一下. 稳定婚姻匹配 至于这道题,显然是一个二分图博弈的模型.考虑选择Bob,我们要找一组匹配使得任何情况下Bob都有匹配边能走.不失一般性假设Alice选择了in ...
- 7 August
P1021 邮票面值设计 暴搜各面值. 剪枝1:面值递增,新面值 \(\in[G_{i-1}+1, n\cdot sum]\). 为什么上界不是 \(n\cdot G_{i-1}+1\) 呢? 剪枝2 ...
- [CSP-S模拟测试]:water(BFS)
题目描述 有一块矩形土地被划分成$n\times m$个正方形小块.这些小块高低不平,每一小块都有自己的高度.水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中.一场大雨 ...
- python中闭包和装饰器
前言: 编程语言发展的过程中,我们为了提高代码利用率,发明了函数式编程.函数将代码封装起来,我们需要用到此功能函数的时候,调用一下就可以了.但是使用的过程中,也遇到了一些问题,比如函数实现的功能不够, ...