Codeforces 1203F1 Complete the Projects (easy version)
- Time limit
2000 ms
- Memory limit
262144 kB
解题思路
看见这题觉得贪心可做,那就贪吧。(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感觉我现在比赛时候想贪心就是瞎猜,猜出一个结论就想办法hack,想不出hack就交上去,然后WA,然后自闭,很难摸到门道)
下面这些是我的做题和思考过程——
显然要先把能加rating和不掉rating的做了,而且要按照要求从低到高的顺序做,因为如果当前rating能满足要求高的,那也能满足要求低的,如果不满足要求高的,那就只能先去做要求低的那些工作以赚取足够的rating,总之先做要求低的赚rating就好。
对于那些掉rating的工作怎么办呢……开始想着类似大于0的部分那样,由于这个阶段rating不断下降,所以先做要求高的。但很容易就把自己hack掉了(r=10;a1=9,b1=-5;a2=8,b2=-1,显然先2后1可以完成全部任务,但按照先做要求高的任务的策略,先1后2,就不能完成任务),然后自闭了……
然后听到机房大佬提出了正确的策略——对于掉rating(\(b_i<0\))的工作,按照\(a_i+b_i\)递减的顺序做就好,没想出来怎么证明,先写了交一发,然后A了。赛后大佬在博客上的证明没太看懂,那就尝试用里面不等式的方式构造hack数据。
假设n=2,总共两件工作,不妨假设其满足\(a_2+b_2<a_1+b_1\),而且应该先2后1,不能先1后2,那么经过思考,可以得到这么几个式子——\(r+b_2\geqslant a_1\)、\(r+b_1 < a_2\)、\(r+b_1+b_2 \geqslant 0\)。前两个式子看着挺像,加起来可以得到\(r+b_2+a_2> r+b_1+a_1\)即\(a_2+b_2>a_1+b_1\),诶,然后就和假设矛盾了,于是不能hack(第三个式子都没用到)。
回顾总结一下——对于满足先2后1不能先1后2的两件工作,它们就会满足\(a_2+b_2>a_1+b_1\)这个式子,于是就没了。
从这里我学到了解贪心题的一种思路——解不等式。
这里有另外一篇题解,感性地解释了这个贪心的道理——
对于价值为正的项目,很明显我们可以直接从小到大的把项目做掉,这样一定是最优的,对于负数来说,我们排差值,差值大的,说明损耗对于自身的损耗较小,这样才能保证自己还有能力做大项目,又能保证做完一个大项目后因为扣的太多而不能去做小项目
虽然还是没太看懂……
吐槽
顺便日常CSDN垃圾。查这场CF的题解的过程中——
百度只查到了一篇这场CF的博文,来自CSDN,点进去并没有看懂,之后各种改关键字,终于多了一点(是不是百度爬虫正好在这段时间里爬过)
- 打开一篇CSDN上的博文,CSDN下方的相似推荐,推荐出来的东西余弦值之差怕是差180度哦,毛线关系都没有。
- 打开一篇博客园上的博文,博客园下方的相关博文一栏推荐的5篇博客,4篇是这场CF的题解,另一篇是之前某次的CF题解
所以CSDN收的VIP费用都拿去给百度竞价排名了吗艹
博客园良心啊。
源代码
#include<stdio.h>
#include<algorithm>
int n,r;
struct P{
int need,change;
bool operator < (const P & a) const{//这里貌似写复杂了
if(change<0&&a.change<0)
{
return change+need>a.change+a.need;
}
else if(change>=0&&a.change>=0)
{
if(need==a.need) return change>a.change;
return need<a.need;
}
else return change>a.change;
}
}p[105];
int main()
{
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++)
scanf("%d%d",&p[i].need,&p[i].change);
std::sort(p+1,p+1+n);
bool ok=1;
for(int i=1;ok&&i<=n;i++)
{
if(r<p[i].need) ok=0;
r+=p[i].change;
if(r<0) ok=0;
}
puts(ok?"YES":"NO");
return 0;
}
Codeforces 1203F1 Complete the Projects (easy version)的更多相关文章
- Codeforces 1203F2. Complete the Projects (hard version)
传送门 首先对于 $b>0$ 的工作显然有个贪心,把 $b>0$ 的按 $a$ 从小到大排序 把能做的都做了,然后得到一个最大等级 剩下就是考虑 $b<0$ 的工作了,看到数据显然可 ...
- Codeforces 1077F1 Pictures with Kittens (easy version)(DP)
题目链接:Pictures with Kittens (easy version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:$dp[i][j ...
- CF1203F2 Complete the Projects (hard version)(结论+背包+贪心)
题目 做法 对于加分的直接贪心 而掉分的用排序后的背包动规 假设有两个物品\((a_1,b_1)(a_2,b_2)\) 选第一个物品后无法选择第二个物品,假设开始值为\(r\):\(r>a_1, ...
- Codeforces1203F2. Complete the Projects (hard version) (贪心+贪心+01背包)
题目链接:传送门 思路: 对于对rating有提升的项目,肯定做越多越好,所以把$b_{i} >= 0$的项目按rating要求从小到大贪心地都做掉,得到最高的rating记为r. 对于剩余的$ ...
- Complete the Projects
F1. Complete the Projects (easy version) F2. Complete the Projects (hard version) 参考:Complete the Pr ...
- Codeforces Round #540 (Div. 3) D1. Coffee and Coursework (Easy version) 【贪心】
任意门:http://codeforces.com/contest/1118/problem/D1 D1. Coffee and Coursework (Easy version) time limi ...
- Codeforces Round #540 (Div. 3) F1. Tree Cutting (Easy Version) 【DFS】
任意门:http://codeforces.com/contest/1118/problem/F1 F1. Tree Cutting (Easy Version) time limit per tes ...
- Codeforces Round #521 (Div. 3) F1. Pictures with Kittens (easy version)
F1. Pictures with Kittens (easy version) 题目链接:https://codeforces.com/contest/1077/problem/F1 题意: 给出n ...
- Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version) 水题
B1. Character Swap (Easy Version) This problem is different from the hard version. In this version U ...
随机推荐
- C语言Ⅰ博客作业03
一. 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/8718 我在这个课 ...
- CF140C New Year Snowmen(贪心+优先队列)
CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...
- [Python3] 026 常用模块 calendar
目录 calendar 1. calendar.calendar(year, w, l, c, m) 2. calendar.prcal(year, w, l, c, m) 3. calendar.m ...
- PTA(Basic Level)1012.数字分类
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n ...
- Python流程控制与while 循环(day01)
一:流程控制 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断哪条叉路是你真正要走的路,如果我们想让 ...
- java 不可变对象 final Collections guava 简单样例
本地环境 jdk1.8 连接 Google Guava官方教程(中文版) journaldev 说明 java的final关键字大家都了解,但是final修饰的如果是引用类型,那么不可修改的其实只是重 ...
- POJ 2492 A Bug's Life 题解
题面 这道题是一道标准的种类并查集: 种类并查集是给每个结点一个权值.然后在合并和查找的时候根据情况对权值来进行维护. 通过将原有的区间范围变大使并查集可以维护种类的联系: #include < ...
- Django查询数据库返回字典dict数据
个人观点: 个人认为,在Django项目中, 开发团队为了让使用该框架的用户都使用自带的序列化功能,从而让框架中的SQL返回值很不直观,对于直接使用SQL语句的用户很犯难. 解决: from djan ...
- Codeforces893F_Subtree Minimum Query
题意 给定一棵树和根,每个点有点权,强制在线询问\(x\)子树里离\(x\)距离不超过\(k\)的最小点权. 分析 权值线段树合并的套路题,dfs,以深度作为下标,点权作为值,对每个点建立一颗权值线段 ...
- 剑指offer 数字翻译成字符串
0 -> 'a', 1->'b', ..., 11 -> 'l', ..., 25->'z'. 计算一个数有多少种不同的翻译方法. 分析:记f[i]表示从第i位起的不同翻译数目 ...