Codeforces 1106 E. Lunar New Year and Red Envelopes 优先队列+dp
题意大致是Bob新年拿红包,每个红包可以在s-t时间内取,但是取了之后得在d+1时间开始才能继续取红包。
同时他女儿能在m个时间点阻止他取红包,求女儿阻止后Bob取得的w总和最小值。
Bob取红包的策略是固定的,有红包就一定取,有多个就取w最大的,仍然有多个就取d最大的。
这个题意读了半天,不得不感叹Bob他孩子真是亲生的,都是傻子ww。
这个题首先第一感觉就是个典型的dp,但是想了想觉得女儿的阻止操作会影响后续当时状态的红包状态,纠结了半天。
但是其实我们可以发现,首先Bob的操作本来应该是固定的,每个时间红包状态显然也是固定的。
Bob的女儿的影响其实是不会改变每个时间取的红包,取了红包后转移到d+1时刻,而被阻止了取红包是转移到now+1时刻。
所以说,我们只要在每个时刻用优先队列得到当时根据Bob策略要取的红包,直接进行转移即可。
#include<bits/stdc++.h>
using namespace std;
int i,i0,n,m,k;
long long dp[100005][205];
struct node
{
int s,t,d,w;
}a[100005];
bool cmp(node a,node b){return a.s<b.s;}
struct cmp0{
bool operator()(node a,node b)
{
if(a.w==b.w)return a.d<b.d;
return a.w<b.w;}
};
priority_queue<node,vector<node>,cmp0>q;
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=k;i++)scanf("%d %d %d %d",&a[i].s,&a[i].t,&a[i].d,&a[i].w);
sort(a+1,a+1+k,cmp);
for(i=2;i<=n+1;i++)for(i0=0;i0<=m;i0++)dp[i][i0]=(long long)INT_MAX*INT_MAX/2;
for(i=1,i0=1;i<=n;i++)
{
while(i0<=k&&a[i0].s==i)q.push(a[i0++]);
while(!q.empty()&&q.top().t<i)q.pop();
if(q.empty())
{
for(int i1=0;i1<=m;i1++)dp[i+1][i1]=min(dp[i+1][i1],dp[i][i1]);
}
else
{
for(int i1=0;i1<=m;i1++)dp[q.top().d+1][i1]=min(dp[q.top().d+1][i1],dp[i][i1]+q.top().w);
for(int i1=0;i1<m;i1++)dp[i+1][i1+1]=min(dp[i+1][i1+1],dp[i][i1]);
}
}
long long ans=(long long)INT_MAX*INT_MAX/2;
for(i=0;i<=m;i++)ans=min(ans,dp[n+1][i]);
printf("%lld\n",ans);
return 0;
}
Codeforces 1106 E. Lunar New Year and Red Envelopes 优先队列+dp的更多相关文章
- Codeforces 1106E. Lunar New Year and Red Envelopes(DP)
E. Lunar New Year and Red Envelopes 题意: 在长度为n的时间轴上,有k个红包,每个红包有领取时间段[s,t],价值w,以及领了个这个红包之后,在时间d到来之前无法再 ...
- 【Codeforces 1106E】 Lunar New Year and Red Envelopes
Codeforces 1106 E 题意:有\(k\)个红包,第\(i\)个红包可以在\(s_i\)到\(t_i\)的时间内抢,同时获得\(w_i\)的钱,但是抢完以后一直到\(d_i\)都不可以继续 ...
- 【Codeforces 1106E】Lunar New Year and Red Envelopes
[链接] 我是链接,点我呀:) [题意] 给你k个红包,每个红包可以在si..ti的时间范围内拿走. 抢完红包之后你得到wi元,然后你需要在di+1时刻才能继续抢红包 时间是线性的从1..n 然后某个 ...
- CF - 1106 E Lunar New Year and Red Envelopes DP
题目传送门 题解: 首先要处理出每个时间点会选择哪一个线段. 对于这个问题,可以用multiset去维护信息. 当时间线开始的时候,往mutiset里面插入这个信息,当时间线结束的时候,删除这个信息. ...
- Lunar New Year and Red Envelopes CodeForces - 1106E (dp)
大意: 总共$n$的时间, $k$个红包, 红包$i$只能在时间$[s_i,t_i]$范围内拿, 并且拿完后时间跳到$d_i+1$,Bob采用贪心策略,每个时间点若有红包能取则取钱数$w_i$最大的, ...
- Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)
题意:过年了,Bob要抢红包.抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收 ...
- Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项
题目大意: 给定n m k:(1≤n≤1e5, 0≤m≤200, 1≤k≤1e5) 表示n个时间长度内 最多被打扰m次 k个红包 接下来k行描述红包 s t d w:(1≤s≤t≤d≤n , 1≤w≤ ...
- CF1106E Lunar New Year and Red Envelopes
比赛时看到这题懵逼了,比完赛仔细一想是个很简单的dp = = 由于题目限制,可以发现\(B\)取红包的策略是唯一的,可以用优先队列预处理出\(B\)在第\(i\)秒可以拿到的红包的收益\(w_i\)和 ...
- codeforces 1106 E
显然是dp啊,dp[i][j]表示到时间i打扰了j次的最小收益 显然要排序,官方题解说set没看懂,优先队列就行啊. 按照时间排序,显然这样扫的话可以保证当前时间点的点在优先队列里吧, 然后有打断和不 ...
随机推荐
- Hadoop shell 一查就会
Hadoop shell 命令有三种格式 hdfs + dfs (必须是dfs) Hadoop + dfs Hadoop + df 命令 说明 hadoop 版本查看 hadoop version h ...
- HDU2612(KB1-N)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- .NET源代码已经下载,潜心研读…
有兴趣的弟兄可以从这里下载:http://referencesource.microsoft.com
- GADL针对矢量数据格式转换的实用工具 —— ogr2ogr
最初,因为可爱的学弟请教如何将ESRI Shapefile文件导入Google Earth接触到了Ogr2Ogr.粗略了解之后发现,这小东西功能强大. 谷歌地球支持矢量数据的展示,前提是数据符合KML ...
- android 每个块半径不同的扇形图,自定义view
1.首先看效果图 2.自定义PieChartView,继承自View,下边为PieChartView代码 package com.yingjinbao.im.peach.customview; imp ...
- 配置hive使用mysql存储metadata metadatastore
hive默认使用derby数据库保存元数据,derby数据库比较小众,并且一次只能打开一个会话,一般修改为mysql数据库. 1.修改conf/hive-site.xml配置项: <pr ...
- OpenStreetMap、googleMap等经纬度和行列号之间相互转化(python,JavaScript,php,Java,C#等)
python: # OpenStreetMap经纬度转行列号 def deg2num(lat_deg, lon_deg, zoom): lat_rad = math.radians(lat_deg) ...
- Oracle数据库通过DBLINK实现远程访问
什么是DBLINK? dblink(Database Link)数据库链接顾名思义就是数据库的链接 ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就 ...
- 第四章 数据更新 4-1 数据的插入(INSERT 语句的使用方法)
一.什么是INSERT 用来插入数据的SQL就是INSERT语句. 二.INSERT 语句的基本语法. 列清单 值清单 列清单和值清单的列数必须保持一致,如果不一致会出错. 原则上,执行一次I ...
- 理解 Linux 的平均负载和性能监控
在本文中,我们将解释 Linux 系统中最关键的管理任务之一——关于系统 / CPU 的负载load和平均负载Load average的性能监控. 首先来看所有的类 UNIX 系统中两个重要的表述 ...