P4989-二进制之谜【堆,贪心】
正題
題目鏈接:https://www.luogu.org/problemnew/show/P4989
題目大意
一個(gè)二進(jìn)制數(shù)兩兩配對(duì),要求
要求配對(duì)最多的情況下所有配對(duì)的距離之和最遠(yuǎn)。
解題思路
將0視為左括號(hào),1視為右括號(hào),題目變?yōu)槔ㄌ?hào)匹配問(wèn)題。
我們考慮貪心,先是交叉的問(wèn)題,我們發(fā)現(xiàn)如果兩個(gè)交叉了,我們讓他們反過(guò)來(lái)配對(duì)(配對(duì)方的那個(gè))的話答案并不會(huì)改變。所有我們不要考慮交叉問(wèn)題。
那我們開(kāi)始做,首先不考慮配對(duì)最多,我們可以開(kāi)一個(gè)小根堆,存儲(chǔ)目前所有已經(jīng)匹配的右括號(hào)還有未左括號(hào)的位置。然后我們每次到一個(gè)右括號(hào)時(shí),取出最小的那個(gè)與其匹配并計(jì)算多出來(lái)的代價(jià)。然后從新丟入堆中。
這是距離之和最遠(yuǎn),但是配對(duì)最多怎么辦,那么我們定義權(quán)值,小根堆維護(hù)權(quán)值。對(duì)于已經(jīng)匹配的右括號(hào)我們權(quán)值就是它的位置;對(duì)于沒(méi)有匹配的左括號(hào),我們讓它的權(quán)值加上一個(gè)?inf-inf?inf就可以了。
這樣就可以保證優(yōu)先匹配沒(méi)有匹配的且權(quán)值最大。
時(shí)間復(fù)雜度O(nlogn)O(n\ log\ n)O(n?log?n)
codecodecode
#include<cstdio> #include<queue> #include<iostream> using namespace std; struct node{int wz,w; }; bool operator <(const node &a,const node &b) {return a.w<b.w;} priority_queue<node> q; int n,ans,a[1000]; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){char c;cin>>c;a[i]=c-'0';}for(int i=1;i<=n;i++){if(!a[i]) q.push((node){i,233333333-i});else{if(q.empty()) continue;ans+=i-q.top().wz;q.pop();q.push((node){i,-i});}}printf("%d",ans); }總結(jié)
以上是生活随笔為你收集整理的P4989-二进制之谜【堆,贪心】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 台式机主板的选择技巧台式电脑主板如何选择
- 下一篇: P2514-[HAOI2010]工厂选址