Codeforces1203F2. Complete the Projects (hard version) (贪心+贪心+01背包)
题目链接:传送门
思路:
对于对rating有提升的项目,肯定做越多越好,所以把$b_{i} >= 0$的项目按rating要求从小到大贪心地都做掉,得到最高的rating记为r。
对于剩余的$b_{i} < 0$的项目,因为r的范围很小,在6e4的亚子,可以考虑用01背包来做。
但是直接上01背包会WA,是因为不同项目选择的先后顺序会对结果有影响。
比如现在的r是5,有两个项目,(ai,bi)分别为(3,-3)和(3,-1),如果先做前面的项目,就会导致rating不够做后一个项目。
考虑任意两个项目i(ai,bi),j(aj,bj),先做i后做j的话,就要求初始的rating >= aj+|bi|,反之要求rating >= ai+b|j|。
显然要求的初始rating越低越好:若aj+|bi| < ai+b|j|,说明前者要求更低,此时应先做i。移项一下就可以得ai-|bi| > aj-|bj|。
所以ai-|bi|(bi<0)越大的项目,就可以越优先地做。根据这个sort一下,跑一遍01背包就出答案了。
代码:O(r*n)
#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define N 105
#define R 30005
#define INF 0x3f3f3f3f
#define mk(x) (1<<x) // be conscious if mask x exceeds int
#define sz(x) ((int)x.size())
#define mp(a,b) make_pair(a, b)
#define endl '\n'
#define lowbit(x) (x&-x) using namespace std;
typedef long long ll;
typedef double db; /** fast read **/
template <typename T>
inline void read(T &x) {
x = ; T fg = ; char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') fg = -;
ch = getchar();
}
while (isdigit(ch)) x = x*+ch-'', ch = getchar();
x = fg * x;
}
template <typename T, typename... Args>
inline void read(T &x, Args &... args) { read(x), read(args...); } struct Node{
int a, b;
bool operator < (const Node& x) const {
return a < x.a;
}
};
int f[R<<];
vector <Node> vpos, vneg;
bool cmp(Node x, Node y) {
return x.a-x.b < y.a-y.b;
}
int main()
{
int n, r;
read(n, r);
for (int i = ; i <= n; i++) {
int a, b; read(a, b);
if (b >= )
vpos.push_back(Node{a, b});
else
vneg.push_back(Node{a, -b});
}
sort(vpos.begin(), vpos.end());
sort(vneg.begin(), vneg.end(), cmp);
int ans = ;
for (int i = ; i < sz(vpos); i++) {
Node tmp = vpos[i];
if (r >= tmp.a) {
r += tmp.b;
ans++;
}
}
for (int i = sz(vneg)-; i >= ; i--) {
Node tmp = vneg[i];
for (int j = max(tmp.a, tmp.b); j <= r; j++) {
f[j-tmp.b] = max(f[j-tmp.b], f[j]+);
}
}
int res = ;
for (int i = ; i <= r; i++)
res = max(res, f[i]);
ans += res;
cout << ans << endl; return ;
}
/*
8 15000
11031 -299
8368 -289
12459 -297
6511 -297
2628 -299
3478 -296
1050 -293
12981 -294
*/
Codeforces1203F2. Complete the Projects (hard version) (贪心+贪心+01背包)的更多相关文章
- CF1203F2 Complete the Projects (hard version)(结论+背包+贪心)
题目 做法 对于加分的直接贪心 而掉分的用排序后的背包动规 假设有两个物品\((a_1,b_1)(a_2,b_2)\) 选第一个物品后无法选择第二个物品,假设开始值为\(r\):\(r>a_1, ...
- Codeforces 1203F2. Complete the Projects (hard version)
传送门 首先对于 $b>0$ 的工作显然有个贪心,把 $b>0$ 的按 $a$ 从小到大排序 把能做的都做了,然后得到一个最大等级 剩下就是考虑 $b<0$ 的工作了,看到数据显然可 ...
- Codeforces 1203F1 Complete the Projects (easy version)
cf题面 Time limit 2000 ms Memory limit 262144 kB 解题思路 看见这题觉得贪心可做,那就贪吧.(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感觉 ...
- Complete the Projects
F1. Complete the Projects (easy version) F2. Complete the Projects (hard version) 参考:Complete the Pr ...
- D - Digging(01背包,贪心)
D - Digging Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit St ...
- HDU -2546饭卡(01背包+贪心)
这道题有个小小的坎,就是低于5块不能选,大于5块,可以任意选,所以就在初始条件判断一下剩余钱数,然后如果大于5的话,这时候就要用到贪心的思想,只要大于等于5,先找最大的那个,然后剩下的再去用背包去选择 ...
- HDU--3466(0-1背包+贪心/后效性)
题意是: 给你一些钱 m ,然后在这个国家买东西, 共有 n 件物品,每件物品有 价格 P 价值 V 还有一个很特别的属性 Q, Q 指 你如过想买这件物品 你的手中至少有这钱Q . 虽 ...
- 0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论
一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i ...
- TopCoder SRM502 Div1 500 贪心 01背包
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级, ...
随机推荐
- DPI的理解
DPI(Dots Per Inch,每英寸点数)是一个量度单位,用于点阵数码影像,指每一英寸长度中,取样.可显示或输出点的数目. DPI是打印机.鼠标等设备分辨率的度量单位.是衡量打印机打印精度的主要 ...
- KNN距离函数的简单拓展
KNN--k-NearestNeighbor可以是是分类法中最简单的算法了. 大致的idea为:找出k各跟新数据点最像的点,看这些点主要属于哪类,那么新数据点也就属于哪类的了. 其伪代码如下: 1. ...
- dapper 分页根据时间条件查询时中的一个坑
当数据库中数据很多的时候,这样写,查询速度会很慢. db.Query<AuditLogModel>(queryStr, searchModel);// 应该这样写 var logDatas ...
- PLAT_SYS_USER
CREATE TABLE "CQTEST"."PLAT_SYS_USER" ( "ID" VARCHAR2(32 BYTE) NOT NUL ...
- java 接口default的判断规则
1.前言 jdk1.8中新增加了default关键字,就是在接口中可以增加默认实现. 因为改动接口所有的实现类都要改动,所以增加了default关键字后不需要修改其他类,默认给所有实现类增加了方法. ...
- 用poi从excel文档导入数据
import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; impo ...
- c++ 运算符 循环
运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 一.算术运算符 二.关系运算符 三.逻辑运算符 四.位运算符 位运算符作用于位,并逐位执行操作 假设如果 A = 60,且 ...
- 安装docker registry
docker pull registry 创建目录 /usr/local/docker/registry 创建 docker-compose.yml version: '3' services: r ...
- 利用python求非线性方程
最近在做的东西中有一件任务,相当于一个函数已知y来求x,网上找了各种办法最终得以实现.在此说明方法,并记录一些坑. 要求的函数比如:log(x) - log(1-x) + 2.2 * (1 -2x) ...
- Head First PHP&MySQl第二章代码
PHP: <html> <head> <title>外星人绑架了我--报道一起绑架</title> </head> <body> ...