日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codeforces1271 D. Portals(dp or 带悔贪心)

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces1271 D. Portals(dp or 带悔贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

D. Portals

由于每個點可以選擇前面的某些點存在重復選擇的情況,考慮除去重復選擇的可能。

貪心:對于每一個城堡,我們都盡可能在最晚的時間控制,也就是在最后一個能控制它的點考慮是否控制。

于是考慮設計dp

狀態表示:f(i,j)f_{(i,j)}f(i,j)?表示考慮到第iii個城堡(已經占領),當前士兵是jjj的情況的最大值
狀態轉移:①不選擇占領城堡從第i?1i-1i?1個城堡轉移②考慮占領城堡

注意:考慮第iii個城堡占領的情況時,可以占領多個城堡因而與“分組背包”不同(分組背包每組只能選一個)

#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr) #pragma GCC optimize(2) #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; constexpr int N=5010; int a[N],b[N],c[N]; int n,m,k; int f[N][N]; int last[N]; vector<int> g[N]; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>m>>k;for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];while(m--){int u,v;cin>>u>>v;last[v]=max(last[v],u);}for(int i=1;i<=n;i++){last[i]=max(last[i],i);g[last[i]].push_back(i);}memset(f,-0x3f,sizeof f);f[0][k]=0;for(int i=1;i<=n;i++){for(int j=a[i];j+b[i]<=5000;j++)f[i][j+b[i]]=max(f[i][j+b[i]],f[i-1][j]);for(auto t:g[i])for(int j=0;j<=4999;j++)f[i][j]=max(f[i][j],f[i][j+1]+c[t]);}int res=-1;for(int i=0;i<=5000;i++) res=max(res,f[n][i]);cout<<res<<'\n';}return 0; }

帶悔貪心

nlog?(n)n\log(n)nlog(n)
用一個優先隊列維護選擇的集合,每次把每個城堡連接的城堡都占領,士兵不夠的時候從優先隊列集合中彈出

#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr) #pragma GCC optimize(2) #include<queue> #include<vector> #include<cstring> #include<iostream> #include<algorithm> using namespace std; constexpr int N=5010; int a[N],b[N],c[N]; int n,m,k; int last[N]; vector<int> g[N]; int main() {IO;int T=1;//Pinit(1000000);//Cinit(1000);//cin>>T;while(T--){cin>>n>>m>>k;for(int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];while(m--){int u,v;cin>>u>>v;last[v]=max(last[v],u);}for(int i=1;i<=n;i++){last[i]=max(last[i],i);g[last[i]].push_back(i);}priority_queue<int,vector<int>,greater<int> > q;int now=k;for(int u=1;u<=n;u++){while(now<a[u]&&q.size()) now++,q.pop();if(now<a[u]) return cout<<-1<<'\n',0;now+=b[u];for(auto t:g[u]) q.push(c[t]),now--;}while(now<0&&q.size()) now++,q.pop();if(now<0) cout<<-1<<'\n';else{int res=0;while(q.size()) res+=q.top(),q.pop();cout<<res<<'\n';}}return 0; }

總結

以上是生活随笔為你收集整理的codeforces1271 D. Portals(dp or 带悔贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。