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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

P4989-二进制之谜【堆,贪心】

發(fā)布時(shí)間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4989-二进制之谜【堆,贪心】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


正題

題目鏈接:https://www.luogu.org/problemnew/show/P4989


題目大意

一個(gè)二進(jìn)制數(shù)兩兩配對(duì),要求

  • 配對(duì)的數(shù)不能交叉(用同一個(gè)區(qū)間但不包含)
  • 0在前1在后
  • 要求配對(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)題。

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