codeforces 1106 E

本文详细解析了一种红包抢夺策略的DP算法实现,通过优先队列管理和选择红包,确保在限定次数内获得最大收益。代码示例清晰展示了算法流程,包括排序、状态转移等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

显然是dp啊,dp[i][j]表示到时间i打扰了j次的最小收益

显然要排序,官方题解说set没看懂,优先队列就行啊。

按照时间排序,显然这样扫的话可以保证当前时间点的点在优先队列里吧,

然后有打断和不打断两种方式。搞一下就行了。

这个题其实只要想清楚,我在每个点能选的红包是唯一的,这样子一想就变得很**了。

头脑混乱写不出来不能怪我啊,我老人家持续表演了一个月的小品了啊

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct Red{
 5     ll s,t,d,w;
 6     bool operator<(const Red& a)const{
 7         if(w==a.w)
 8             return d<a.d;
 9         return w<a.w;
10     }
11 }r[100005];
12 bool cmp(Red a,Red b){
13     if(a.s==b.s){
14         if(a.w==b.w){
15             return a.d>b.d;
16         }
17         return a.w>b.w;
18     }
19     return a.s<b.s;
20 }
21 int n,m,k;
22 ll dp[100005][201];
23 priority_queue<Red> q;
24 int main() {
25     ios::sync_with_stdio(false);
26     cin>>n>>m>>k;
27     for(int i=2;i<=n+1;i++)for(int j=0;j<=m;j++)dp[i][j]=1e18;
28     for(int i=1;i<=k;i++){
29         cin>>r[i].s>>r[i].t>>r[i].d>>r[i].w;
30     }
31     sort(r+1,r+1+k,cmp);
32     int j=1;
33     for(int i=1;i<=n;i++){//
34         for(;j<=k;){
35             if(r[j].s<=i) {
36                 q.push(r[j]);
37                 j++;
38             } else break;
39         }
40         while (!q.empty()&&q.top().t<i) q.pop();
41         if(q.empty()){
42             for(int l=0;l<=m;l++){
43                 dp[i+1][l]=min(dp[i+1][l],dp[i][l]);
44             }
45             continue;
46         }
47         Red tmp = q.top();
48         for(int l=0;l<=m;l++) {
49             dp[min(tmp.d+1,n+1ll)][l]=min(dp[min(tmp.d+1,n+1ll)][l],dp[i][l]+tmp.w);
50         }
51         for(int l=1;l<=m;l++){
52             dp[i+1][l]=min(dp[i+1][l],dp[i][l-1]);
53         }
54     }
55     ll ans = 1e18;
56     for(int i=0;i<=m;i++){
57         ans = min(ans,dp[n+1][i]);
58     }
59     cout<<ans<<endl;
60 }
View Code

 

转载于:https://www.cnblogs.com/MXang/p/10347189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值