【codeforces E. Lunar New Year and Red Envelopes】【贪心】【优先队列维护】【dp】【好题】

本文主要是介绍【codeforces E. Lunar New Year and Red Envelopes】【贪心】【优先队列维护】【dp】【好题】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:

有n个红包,每个红包可以在[si,ti]的时间内拾起,拾起后获得wi元,但是到di这个时刻都不能再获取其他红包

a非常贪心,他在每一时刻,如果这个时刻可以拾起红包,它会拾起金额最大的,如果同时有多个金额最大的

他会拾起di最大的

有m次干扰他的机会,每次干扰他使得他在某个时刻不能拾起红包他的女儿可以

如果他的女红采用最优操作,他最少获得多少金钱

 

思路:

我们发现在某个时刻如果可以拾起红包,那么这个红包已经确定,可以用优先队列预处理

再考虑dp[i][j]表示在第i个时刻,用了j次机会的最少金币dp[i][j]表示在第i个时刻,用了j次机会的最少金币

有两个转移有两个转移

一个是这个时刻如果没有红包可以拿那么一个是这个时刻如果没有红包可以拿那么

dp[i+1][j]=min(dp[i+1][j],dp[i][j])dp[i+1][j]=min(dp[i+1][j],dp[i][j])

如果有红包可以拿

dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j])dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j])

dp[di+1][j]=min(dp[di+1][j],dp[i][j]+wi)

【代码】

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll maxn = 1e5 + 6;
const ll inf = 0x3f3f3f3f3f3f3f3f;struct node {ll s, t, d, w;bool operator <(const node &r)const {if (w == r.w)return d < r.d;return w < r.w;}
}k[maxn];ll gt[maxn];
ll nxt[maxn];
ll dp[maxn][202];ll cmp(node &a, node &b) {return a.s < b.s;
}
int main() {ll n, m, p;while (~scanf("%lld%lld%lld", &n, &m, &p)) {for (ll i = 1; i <= p; i++) {scanf("%lld%lld%lld%lld", &k[i].s, &k[i].t, &k[i].d, &k[i].w);}sort(k + 1, k + 1 + p, cmp);priority_queue<node>q;ll cnt = 1;for (ll i = 1; i <= n; i++) {while (cnt <= p && k[cnt].s <= i) {q.push({ k[cnt++] });}while (q.size() && q.top().t < i)q.pop();if (q.size()) {node tmp = q.top();gt[i] = tmp.w;nxt[i] = tmp.d + 1;}else {gt[i] = 0;nxt[i] = i + 1;}}memset(dp, inf, sizeof(dp));for (ll i = 0; i <= m; i++)dp[1][i] = 0;for (ll i = 1; i <= n; i++) {for (ll j = 0; j <= m; j++) {if (gt[i]) {dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j]);dp[nxt[i]][j] = min(dp[nxt[i]][j], dp[i][j] + gt[i]);}else {dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]);}}}ll res = inf;for (ll i = 0; i <= m; i++) {res = min(res, dp[n + 1][i]);}printf("%lld\n", res);}
}

 

这篇关于【codeforces E. Lunar New Year and Red Envelopes】【贪心】【优先队列维护】【dp】【好题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244714

相关文章

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Python中__new__()方法适应及注意事项详解

《Python中__new__()方法适应及注意事项详解》:本文主要介绍Python中__new__()方法适应及注意事项的相关资料,new()方法是Python中的一个特殊构造方法,用于在创建对... 目录前言基本用法返回值单例模式自定义对象创建注意事项总结前言new() 方法在 python 中是一个

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`