首页 > 其他分享 >[lnsyoj3174/luoguP4823/TJOI2013]拯救小矮人

[lnsyoj3174/luoguP4823/TJOI2013]拯救小矮人

时间:2024-08-15 21:16:26浏览次数:11  
标签:小矮人 return lnsyoj3174 删除 PII int TJOI2013 include DP

题意

给定序列 \(a,b\) 和常数 \(h\),若序列中存在值 \(k\) 满足 \(b_k+\sum_{i=1}^{\operatorname{len}(a)} a_i \ge h\),则可将 \(a_k,b_k\) 删除,求从 \(a\) 中删除的数的数量最大为多少。

sol

由于 \(b\) 越小的数越靠后越难被删除,同时,\(a\) 越大的数越可以帮助其他数字被删除,因此我们希望先被删除的数的 \(a\),和 \(b\) 都更小,因此我们按照 \(a+b\) 来进行排序,然后进行一次 DP,计算前 \(i\) 个值中,被删掉 \(j\) 个值剩下的所有值的 \(\sum a_i\) 为多少。此时,若该值 DP 值非负,说明这是一个合法状态,因此倒序枚举,若 DP 值非负,则直接输出即可。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#define x first 
#define y second 

using namespace std;
typedef pair<int, int> PII;

const int N = 2005;

PII a[N];
int n, h;
int f[N][N];

bool cmp(PII a, PII b){
    if (a.x + a.y != b.x + b.y) return a.x + a.y < b.x + b.y;
    return a.x < b.x;
}

int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d%d", &a[i].x, &a[i].y);
    scanf("%d", &h);
    sort(a + 1, a + n + 1, cmp);
    
    memset(f, -0x3f, sizeof f);
    for (int i = 0; i <= n; i ++ ) {
        f[i][0] = 0;
        for (int j = 1; j <= n; j ++ ) 
            f[i][0] += a[j].x;
    }

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ ) {
            f[i][j] = f[i - 1][j];
            if (f[i - 1][j - 1] + a[i].y >= h) f[i][j] = max(f[i][j], f[i - 1][j - 1] - a[i].x);
        }

    // for (int i = 0; i <= n; i ++ ) printf("%d\n", f[n][i]);

    for (int i = n; i >= 0; i -- )
        if (f[n][i] >= 0) {
            printf("%d\n", i);
            return 0;
        }

}

标签:小矮人,return,lnsyoj3174,删除,PII,int,TJOI2013,include,DP
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj3174_luoguP4823

相关文章

  • P3964 [TJOI2013] 松鼠聚会
    题意给定\(n\)个点,求出一个点使得每个点到这个点的切比雪夫距离之和最小。思路首先,我们可以把题目中的切比雪夫距离转化为曼哈顿距离,因为我们知道形如\((x,y)\)点之间的曼哈顿距离等于\((x+y,x-y)\)点之间的切比雪夫距离,\((x,y)\)点之间的切比雪夫距离等于\(\le......
  • [题解]P3966 [TJOI2013] 单词
    P3966[TJOI2013]单词用\(p[i]\)来表示经过节点\(i\)的字符串个数。那么节点\(u\)的答案就是fail树上,以\(u\)为根的子树的\(p\)之和。由于我们已经计算了\(p[i]\),所以字符串\(i\)作为模式串本身&模式串前缀的情况已经考虑了。还需考虑\(i\)作为模式串后缀的情况,而只有fail树上......
  • P3964 [TJOI2013] 松鼠聚会
    原题链接题解对于\((a_1,b_1),(a_2,b_2)\)的切比雪夫距离,可以看做成\((\frac{a_1+b_1}{2},\frac{a_1-b_1}{2}),(\frac{a_2+b_2}{2},\frac{a_2-b_2}{2})\)的曼哈顿距离不信你分类讨论看看某一点到其他点的曼哈顿距离,等于所有小于该点和大于该点的x,y的坐标差之和code#incl......
  • P4309 [TJOI2013] 最长上升子序列题解
    P4309[TJOI2013]最长上升子序列题解正文单调队列?单调锤子队列!!本题的操作可以省略成:单点修改区间查询好极了,此时我们有两种选择:线段树和树状数组,(平衡树,真不会,下一位因为不需要其他操作,所以我们还是选择更小巧更可爱的树状数组吧。关于vectorvector的insert操作支......
  • [TJOI2013] 松鼠聚会 题解
    [TJOI2013]松鼠聚会题解切比雪夫距离切比雪夫距离指的是在平面上的两个点\((x_1,y_1)\),\((x_2,y_2)\)之间横纵坐标之差绝对值中的大者。用公式表示则是\(f(a,b)=max(|x_a-x_b|,|y_a-y_b|)\)。切比雪夫距离与曼哈顿距离之间可以相互转换切比雪夫—>曼哈顿:\((x_1,y_1)\),\((x......
  • P3966 [TJOI2013]单词
    P3966[TJOI2013]单词题意给出一堆的单词,求出每个单词在这堆单词里面出现的次数。思路建立一颗树,首先找出每个出现的次数,然后从最小面开始进行遍历,从而进行累加,就可以......
  • P3963 [TJOI2013] 奖学金——主席树
    最后翻看题解才发现可以不用主席树……就当是练习好了基本思路本题要让中位数最大,如果是最小值最大我们可以用二分答案,二中位数最大可不可以呢?显然是不行的,所以我们枚举......
  • louguP3966 [TJOI2013]单词【AC自动机】
    小时候一直不理解为什么老人会呆呆地坐着,望着远方很久很久少年不会知道自己的勇气意味着什么,他只是在武汉四十度的天气下奋力奔跑。在军训伊始终于成功联系上了导师,一个......