题目

做法

对于加分的直接贪心

而掉分的用排序后的背包动规

假设有两个物品\((a_1,b_1)(a_2,b_2)\)

选第一个物品后无法选择第二个物品,假设开始值为\(r\):\(r>a_1,r+b_1<a_2\Longrightarrow r<a_2-b_1\)

如果先选择第二个物品后可以选择第一个物品:\(r>a_2,r+b_2\ge a_1\Longrightarrow r\ge a_1-b_2\)

则当\(a_1-b_2\le a_2-b_1\)时,先选择\(2\)更优:\(a_1+b_1\le a_2+b_2\)

我们按照\(a+b\)排序后直接动规即可

细节:在处理背包时要根据\(a\)的限制转移

Code

#include<bits/stdc++.h>
typedef int LL;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
const LL maxn=1e2+9,inf=0x3f3f3f3f;
struct node{
LL x,y;
}a[maxn],b[maxn];
LL n,r,ans,tot1,tot2;
LL f[60009];
inline bool cmp1(node xx,node yy){
return xx.x<yy.x;
}
inline bool cmp2(node xx,node yy){
if(xx.x+xx.y==yy.x+yy.y) return xx.x<yy.x;
else return xx.x+xx.y>yy.x+yy.y;
}
int main(){
n=Read(); r=Read();
for(LL i=1;i<=n;++i){
LL x(Read()),y(Read());
if(y>=0) a[++tot1]=(node){x,y};
else b[++tot2]=(node){x,y};
}
std::sort(a+1,a+1+tot1,cmp1);
for(LL i=1;i<=tot1;++i){
if(r>=a[i].x) r+=a[i].y,++ans;
else break;
}
std::sort(b+1,b+1+tot2,cmp2);
memset(f,-inf,sizeof(f));
f[r]=ans;
for(LL i=1;i<=tot2;++i)
for(LL j=b[i].x;j<=60000;++j){
if(j+b[i].y<0) continue;
f[j+b[i].y]=std::max(f[j+b[i].y],f[j]+1);
}
for(LL i=0;i<=60000;++i) ans=std::max(ans,f[i]);
printf("%d\n",ans);
return 0;
}

CF1203F2 Complete the Projects (hard version)(结论+背包+贪心)的更多相关文章

  1. Codeforces1203F2. Complete the Projects (hard version) (贪心+贪心+01背包)

    题目链接:传送门 思路: 对于对rating有提升的项目,肯定做越多越好,所以把$b_{i} >= 0$的项目按rating要求从小到大贪心地都做掉,得到最高的rating记为r. 对于剩余的$ ...

  2. Codeforces 1203F1 Complete the Projects (easy version)

    cf题面 Time limit 2000 ms Memory limit 262144 kB 解题思路 看见这题觉得贪心可做,那就贪吧.(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感觉 ...

  3. Codeforces 1203F2. Complete the Projects (hard version)

    传送门 首先对于 $b>0$ 的工作显然有个贪心,把 $b>0$ 的按 $a$ 从小到大排序 把能做的都做了,然后得到一个最大等级 剩下就是考虑 $b<0$ 的工作了,看到数据显然可 ...

  4. Complete the Projects

    F1. Complete the Projects (easy version) F2. Complete the Projects (hard version) 参考:Complete the Pr ...

  5. 集训第四周(高效算法设计)L题 (背包贪心)

    Description   John Doe is a famous DJ and, therefore, has the problem of optimizing the placement of ...

  6. How to manage IntelliJ IDEA projects under Version Control Systems

    如何在版本控制系统中管理 IntelliJ IDEA 项目文件 IntelliJ IDEA 设置详细,功能强大.在实际工作中,我们有时会遇到跟同事共享项目文件的情况. 那么,有哪些项目文件应该加入到版 ...

  7. Codeforces Round #579 (Div. 3) Complete the Projects(贪心、DP)

    http://codeforces.com/contest/1203/problem/F1 Examples input 1 - - output 1 YES input 2 - - output 2 ...

  8. HDU -2546饭卡(01背包+贪心)

    这道题有个小小的坎,就是低于5块不能选,大于5块,可以任意选,所以就在初始条件判断一下剩余钱数,然后如果大于5的话,这时候就要用到贪心的思想,只要大于等于5,先找最大的那个,然后剩下的再去用背包去选择 ...

  9. HDU--3466(0-1背包+贪心/后效性)

    题意是: 给你一些钱 m ,然后在这个国家买东西, 共有 n 件物品,每件物品有  价格 P    价值 V    还有一个很特别的属性 Q, Q 指 你如过想买这件物品 你的手中至少有这钱Q . 虽 ...

随机推荐

  1. 一个 Vim 重度用户总结的 vim 超全指南

    我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 Vim 的朋友来说,可能还无法体会到这种感觉.由于使用 ...

  2. python PIL图像处理库

    1. Introduction PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. ...

  3. Keepalived简单理解

    Keepalived Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障.一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTE ...

  4. JavaScript:将key和value不带双引号的JSON字符串转换成JSON对象的方法

    遇到相关的问题,花了两天的时间来解决,深感来之不易,所以做如下的总结,希望遇到此问题的码农能更快的找到解决办法! var jsonArr= [{col:TO_CHAR(HZRQ,'YYYYMM'),t ...

  5. java中将对象引用设置为null对于GC有没有帮助

    相信,网上很多java性能优化的帖子里都会有这么一条: 尽量把不使用的对象显式得置为null.这样有助于内存回收 可以明确的说,这个观点是基本错误的.sun jdk远比我们想象中的机智.完全能判断出对 ...

  6. linux之expect用法

    1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西. 注意:这一 ...

  7. nginx 配置文件详解(转)

    #运行用户 #user nobody; #启动进程,通常设置成和cpu的数量相等或者2倍于cpu的个数(具体结合cpu和内存).默认为1 worker_processes 1; #全局的错误日志和日志 ...

  8. 安装k8s,高可用3 master安装脚本

    每个在新集群里,记得更改三个节点的IP即可. 第一步还是要执行那个root脚本,准备好系统环境,安装好软件. 先安装在每个节点上使用docker安装好etcd.(sh script domain et ...

  9. windows 10 下部署WCF 一些细节

    总体上在IIS中部署一个WCF服务和Win7没有什么区别 但是,如果你使用的是.NET 4.5开发的 WCF服务,而windows10 又安装了.net 4.7 那么你需要注意下面问题

  10. python算法与数据结构-冒泡排序算法(32)

    一.冒泡排序介绍 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要 ...