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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces D. Berserk And Fireball(贪心)

發(fā)布時(shí)間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces D. Berserk And Fireball(贪心) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接:http://codeforces.com/contest/1380/problem/D

題目大意:

? ? ? ?n個(gè)士兵站成一排,每個(gè)有一個(gè)能力值a[i](兩兩不同)。

? ? ? ?現(xiàn)在有兩種操作

? ? ? ? 1. 花費(fèi)x的代價(jià),擊敗連續(xù)的k個(gè)士兵。

? ? ? ? 2. 花費(fèi)y的代價(jià),選擇兩個(gè)相鄰的,大的擊敗小的。

? ? ? ?問留下所給的另外一個(gè)序列b的士兵,最小代價(jià)。

題目思路:

? ? ? ?明顯是根據(jù)b序列把各個(gè)a序列區(qū)間按照分開,然后把這些段兒刪掉即可,如果思考dp的話,明顯這是個(gè)和區(qū)間有關(guān)系,但是不太好轉(zhuǎn)移。

? ? ? ? 先考慮-1的情況吧,第一種就是b和a序列中的各個(gè)元素的先后順序不能發(fā)生變化。

? ? ? ? ? ? ? 第二種就是,當(dāng)這一段長度不足k,而且段中的最大值,比這一段兩邊的還要大的時(shí)候,發(fā)現(xiàn)這個(gè)最大的怎么都刪不掉。

? ? ? ? 這時(shí)思路就出來了,只要按照夠不夠k個(gè),最大元素和兩邊元素的大小關(guān)系就可以判斷了。

1。 當(dāng)這一段不足k,且最大元素比兩邊的還要大,這個(gè)最大元素刪不掉,輸出-1.

2.? ? 當(dāng)這一段不足k,最大元素比兩邊某個(gè)小,那么可以選擇一個(gè)一個(gè)刪。

3.? ? ?當(dāng)這一段大于k個(gè),那么無論如何都可以刪掉這一段,因?yàn)榭梢詢?nèi)部刪,在判斷k*y 和 x的關(guān)系,決定使用哪種刪法貪心,前? ? ? ? ?提是要先把%k的余數(shù)那一部分處理掉,再解決這個(gè)剩下的k的倍數(shù)。

? ? ? ?代碼中再a,b序列的首位添加了-1便于操作,雙指針的方法,idx1,idx2是指在a上滑動(dòng),定位待刪除區(qū)間。idx3是在b上滑動(dòng),表示現(xiàn)在要在a中定位的兩個(gè)值。

#include<bits/stdc++.h> #define ll long long using namespace std; const ll MAXN = 2e5+5; ll b[MAXN],a[MAXN]; int main() {ll n,m;ll x,k,y;cin>>n>>m;cin>>x>>k>>y;a[0] = b[0] = -1;for(ll i=1;i<=n;i++){cin>>a[i];}for(ll i=1;i<=m;i++){cin>>b[i];}a[++n] = -1;b[++m] = -1;ll idx1 = 0;ll idx2 = 0;ll idx3 = 0;ll ans = 0;bool f = 1;while(idx3<m){while(idx1<=n){if(a[idx1]!=b[idx3]){idx1++;}else{break;}}if(idx1>n){f=0;break;}idx3++;while(idx2<=n){if(a[idx2]!=b[idx3]){idx2++;}else{break;}}// cout<<idx1<<" * "<<idx2<<" * "<<idx3<<endl;if(idx2>n){f = 0;break;}ll num = idx2-idx1-1;ll Max = 0;for(ll i=idx1+1;i<=idx2-1;i++){Max = max(Max,a[i]);}// cout<<Max<<" ** "<<endl;if(num<k){if(Max<a[idx1] || Max<a[idx2]){ans += num*y;// cout<<num*y<<" ****1 "<<endl;}else{f=0;break;}}else{ll md = num%k;ll cnt = num/k;num -= md;ans += md*y;// cout<<md*y<<" ***+ "<<endl;if(y*k<x){if(Max<a[idx1] || Max<a[idx2]){ans += y*num;}else{ans += x;ans += (num-k)*y;}// cout<<num*y<<" ****2 "<<endl;}else{ans += cnt*x;// cout<<cnt*x<<" ****3 "<<endl;}}//cout<<endl;}if(!f){cout<<-1<<endl;}else {cout<<ans<<endl;} }

?

總結(jié)

以上是生活随笔為你收集整理的Codeforces D. Berserk And Fireball(贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。