背包

谁在说谎

https://ac.nowcoder.com/acm/contest/1168/H

转化为 求最大不重合区间权值和的问题 就非常直观了。

#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define x first
#define y second
map<int, int> mp[N];
int n, a, b;
int dp[N];  //最大
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d%d", &a, &b);  // a个人比他高 b个人比他低
        if (a + b > n) continue;
        mp[b][n - a]++;  // n-a :不高于他的人数 也就是说,n-a=b+同分人数
    }
    for (int i = 0; i < n; i++) {
        for (auto it : mp[i])
            dp[it.x] = max(dp[it.x],              //可以放弃这个区间
                           dp[i] + min(it.x - i,  //同分的容纳上限n-a-b
                                       it.y));    //有多少个报了这个的
        dp[i + 1] = max(dp[i + 1], dp[i]);        //可以放弃这个区间
    }
    printf("%d\n", n - dp[n]);
    return 0;
}
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

昨天 12:24
重庆大学 运营
坏消息:和好工作擦肩而过
给点吧求求了:怎么可能因为差几秒,估计就是简历更好看婉拒了
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhan...:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务