Codeforces 1203F1 Complete the Projects (easy version)

cf题面

  • 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;
}

原文地址:https://www.cnblogs.com/wawcac-blog/p/11359505.html

时间: 2024-10-31 20:47:07

Codeforces 1203F1 Complete the Projects (easy version)的相关文章

Codeforces 1203F2 Complete the Projects (hard version)

[cf题面](https://codeforces.com/contest/1203/problem/F2 Time limit 2000 ms Memory limit 262144 kB 解题思路 先留坑,吃完饭来填 源代码 #include<cstdio> #include<algorithm> int n,r; struct Data{ int need,delta; bool operator < (const Data & a)const{ if(delt

Codeforces 1203F2 Complete the Projects (hard version)(dp)

啊,dp,万恶的dp. 本来不想补的,被某人押着说div3这么可以不ak于是不得不补了.真是痛苦的经历.(笑) 题目链接:https://codeforces.com/problemset/problem/1203/F2 题目大意:给定任务个数n和初始值r,完成每个任务需要有ai的r值,完成后r值会改变bi,问最多能完成多少任务(要保证最后r>=0) 思路:首先如果是正值的话自然按照a从小到大排一遍能加的都加上,然后问题在于负值.贪心显然不行,或者说这其实就是个背包问题的轻度转换,首先要做的预处

CodeforcesF2. 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不够做后一个项目. 考虑任

Codeforces 1335E1 - Three Blocks Palindrome (easy version)

题面 题意 给定一个长度为 n 的数列 定义要求的回文子数列满足下图条件 其中 x 与 y 可以为 0 即这个回文子数列可以是数字完全相同的一个子数列 也可以是只包含两种数字,且其中一种平均分布在另一种数字的两侧 求出最长的回文子数列长度 解题思路 在输入时往vector里记录下每个数字出现的位置 然后开始枚举位于两侧的数字的种类 i( i = 1 ~ 26 ) 首先考虑这个回文子数列只包含一种数字,刚好根据枚举 直接将答案与枚举的字符数量取大(与枚举到的vector[i].size取大) 然后

Codeforces 1335E2 - Three Blocks Palindrome (hard version)

题面 题意/解题思路 直接延用 Easy 版本的想法即可 详解见上一篇博客Codeforces 1335E1 - Three Blocks Palindrome (easy version) 完整程序 (93ms/2000ms) #include<bits/stdc++.h> using namespace std; int ar[200050]; vector<int> v[210]; void solve() { int n,ans=0; cin>>n; for(i

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 test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an undirected tree of nn vertices. Some vert

Codeforces Round #575 (Div. 3) D1. RGB Substring (easy version)

Codeforces Round #575 (Div. 3) D1 - RGB Substring (easy version) The only difference between easy and hard versions is the size of the input. You are given a string s consisting of n characters, each character is 'R', 'G' or 'B'. You are also given a

2016 省热身赛 Earthstone: Easy Version

Earthstone: Easy Version Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Earthstone is a famous online card game created by Lizard Entertainment. It is a collectible card game that revolves around turn-based mat

05-图2. Saving James Bond - Easy Version (25)

05-图2. Saving James Bond - Easy Version (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the world's most famous spy, was capture