ATcoder-[AGC048B]Bracket Score【结论,贪心】
正題
題目鏈接:https://atcoder.jp/contests/agc048/tasks/agc048_b
題目大意
長度為nnn的合法括號序列可以包含[...][...][...]和(...)(...)(...)。
如果在第iii個(gè)位置是′(′'\ (\ '′?(?′ 或者 ′)′'\ )\ '′?)?′那么可以獲得aia_iai?的權(quán)值,否則獲得bib_ibi?的權(quán)值。
求一個(gè)合法的括號序列使得權(quán)值最大。
解題思路
首先對于每對匹配的括號肯定是一奇一偶的,有一個(gè)結(jié)論就是只要兩種括號的奇和偶數(shù)上括號的個(gè)數(shù)相同,那么就一定有一種合法匹配。
大致的理解方法就是,對于每一種方案至少存在一對相鄰的同種括號,否則就不滿足以上性質(zhì),然后就可以將這對括號刪去。重復(fù)以上過程就可以證明該結(jié)論
那么考慮貪心選取,對于每個(gè)位置我們先默認(rèn)選擇小括號,那么如果轉(zhuǎn)換的話就會(huì)獲得wi=ai?biw_i=a_i-b_iwi?=ai??bi?的價(jià)值。然后每次選取一奇一偶的wiw_iwi?,把奇偶的wiw_iwi?分開排序選取即可。
時(shí)間復(fù)雜度O(nlog?n)O(n\log n)O(nlogn)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const ll N=1e5+10; ll n,a[N],b[N],sum,ans; vector<ll > v[2]; int main() {scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)scanf("%lld",&b[i]),sum+=b[i];for(ll i=1;i<=n;i++)v[i&1].push_back(a[i]-b[i]);sort(v[0].begin(),v[0].end());sort(v[1].begin(),v[1].end());ans=sum;for(ll i=v[0].size()-1;i>=0;i--)sum+=v[0][i]+v[1][i],ans=max(ans,sum);printf("%lld\n",ans); }總結(jié)
以上是生活随笔為你收集整理的ATcoder-[AGC048B]Bracket Score【结论,贪心】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网址超链接怎么做的(网址的超链接怎么弄)
- 下一篇: jzoj6065-[NOI2019模拟2