贪心——Berserk And Fireball
生活随笔
收集整理的這篇文章主要介紹了
贪心——Berserk And Fireball
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題解:
我們可以想到有兩種清除的方式,一種是清楚的區間長度大于k的時候我們有兩種方案,一種是先把區間縮小到k的倍數(這樣無論區間里的值會不會大于端點兩端的值都會被清楚),其次我們可以選擇一個個的清除,這樣的話必須滿足區間內的最大值要小于我們左右端點中的一個。解題的時候避免右半邊掃描不完全所以a,b數組可以都加一個哨兵0,這樣的話在最后一個位置就一定能夠掃描完。
#include<bits/stdc++.h> using namespace std; #define int long long typedef long long ll; typedef long double ld; const int N=2e5+10; const int inf=1e18; int a[N],b[N]; signed main() {int n,m; scanf("%lld%lld",&n,&m);int x,k,y; scanf("%lld%lld%lld",&x,&k,&y);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);for(int i=1;i<=m;i++) scanf("%lld",&b[i]);a[n+1]=b[n+1]=0;int now=1,flag=0,ans=0; // while(a[now]!=b[1]) now++;for(int i=1;i<=m+1;i++){int len=0,maxn=-1;while(now<=n&&a[now]!=b[i]){maxn=max(maxn,a[now]);now++,len++;} // cout<<now<<endl;if(now==n+2) {flag=1;break;}now++;int res=inf;for(int j=1;j*k<=len;j++){res=min(res,j*x+(len-j*k)*y);}if(maxn<b[i]||(maxn<b[i-1]&&i-1>0)) res=min(res,len*y);if(res==inf){flag=1;break;}ans+=res;}if(flag) puts("-1");else printf("%lld\n",ans); }總結
以上是生活随笔為你收集整理的贪心——Berserk And Fireball的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [英语歌曲]老鹰之歌:If I Coul
- 下一篇: sp 导出unity哪个_SP与Unit