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(delta>=0)
            return need<a.need;
        return need>a.need;//总和越大越靠前
    }
}pos[105],neg[105];//上分的和掉分的
int numpos,numneg;//两种的数量
int dp[60010];
int main()
{
    scanf("%d%d",&n,&r);
    for(int i=1,x,y;i<=n;i++)
    {
        scanf("%d%d",&x,&y);
        if(y>=0)
            pos[numpos++]={x,y};
        else
            neg[numneg++]={x+y,y};
    }
    std::sort(pos,pos+numpos);
    std::sort(neg,neg+numneg);
    int ans=0;
    for(int i=0;i<numpos;i++)
    {
        if(r>=pos[i].need) ans++,r+=pos[i].delta;
        else break;
    }
    dp[r]=ans;//当前rating能拿到的最多的工程数量
    for(int i=0;i<numneg;i++)
    {
        int nd=neg[i].need-neg[i].delta,dt=neg[i].delta;//排完序之后恢复输入的原始数据
        for(int j=std::max(nd,-dt);j<=r;j++)//std::max(nd,-delta)用于保证rating够用且满足要求
        {//dt<0,j+dt是更小的rating,比较的作用是降到那个rating时可以完成的最多的工作数量
            dp[j+dt]=std::max(dp[j]+1,dp[j+dt]);
        }
    }
    ans=-1;
    for(int i=0;i<=r;i++)
    {
        ans=std::max(dp[i],ans);
    }
    printf("%d\n",ans);
    return 0;
}

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

时间: 2024-10-28 14:43:00

Codeforces 1203F2 Complete the Projects (hard version)的相关文章

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从小到大排一遍能加的都加上,然后问题在于负值.贪心显然不行,或者说这其实就是个背包问题的轻度转换,首先要做的预处

Codeforces 1203F1 Complete the Projects (easy version)

cf题面 Time limit 2000 ms Memory limit 262144 kB 解题思路 看见这题觉得贪心可做,那就贪吧.(昨天真是贪心的一天,凌晨才被这两道贪心题虐,下午多校又来,感觉我现在比赛时候想贪心就是瞎猜,猜出一个结论就想办法hack,想不出hack就交上去,然后WA,然后自闭,很难摸到门道) 下面这些是我的做题和思考过程-- 显然要先把能加rating和不掉rating的做了,而且要按照要求从低到高的顺序做,因为如果当前rating能满足要求高的,那也能满足要求低的,如

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 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 1108E2 Array and Segments (Hard version) 差分, 暴力

Codeforces 1108E2 E2. Array and Segments (Hard version) Description: The only difference between easy and hard versions is a number of elements in the array. You are given an array \(a\) consisting of \(n\) integers. The value of the \(i\)-th element

Codeforces 1172C2 Nauuo and Pictures (hard version) dp

Nauuo and Pictures (hard version 首先考虑简单版本的, 一个一个dp求出来, 分成三坨, 一坨当前要求照片, 一坨除了当前的喜欢的照片, 一坨除了当前的讨厌的照片. 单次dp   50 ^ 4 感觉hard的也挺简单的.. 我们先算出最后喜欢的照片的总w, 和讨厌的照片的总w, 然后每个的贡献就是在原先的w中所占的比例. #include<bits/stdc++.h> #define LL long long #define LD long double #de

Codeforces - 1203D2 - Remove the Substring (hard version) - 双指针

https://codeforces.com/contest/1203/problem/D2 上次学了双指针求两个字符串之间的是否t是s的子序列.但其实这个双指针可以求出的是s的前i个位置中匹配t的最长的前缀.反过来求一次可以得到最长的后缀. 然后怎么找要删除的位置呢?暴力n^2肯定可以,然后线性写挂到自闭. 枚举位置[i,j),注意j可以取相等,所以预处理前后缀的时候把n位置的后缀也算好. 去除子串[i,j),那么剩下的就是[0,i-1]和[j,n-1]两个子串,他们匹配的长度加起来超过tl就

Codeforces#590(1234)——B2Social Network (hard version)

B2. Social Network (hard version) time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The only difference between easy and hard versions are constraints on nn and kk. You are messaging in one

CodeForces 716B Complete the Word

留坑! 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=50000+2; 4 char ca[N]; 5 int main() 6 { 7 int i,j; 8 9 while(scanf("%s",ca)!=EOF) 10 { 11 12 if(strlen(ca)<26) 13 { 14 printf("-1\n"); 15 continue; 16 } 17 int