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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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


正題

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


題目大意

一個二進制數(shù)兩兩配對,要求

  • 配對的數(shù)不能交叉(用同一個區(qū)間但不包含)
  • 0在前1在后
  • 要求配對最多的情況下所有配對的距離之和最遠。


    解題思路

    將0視為左括號,1視為右括號,題目變?yōu)槔ㄌ柶ヅ鋯栴}。

    我們考慮貪心,先是交叉的問題,我們發(fā)現(xiàn)如果兩個交叉了,我們讓他們反過來配對(配對方的那個)的話答案并不會改變。所有我們不要考慮交叉問題。

    那我們開始做,首先不考慮配對最多,我們可以開一個小根堆,存儲目前所有已經(jīng)匹配的右括號還有未左括號的位置。然后我們每次到一個右括號時,取出最小的那個與其匹配并計算多出來的代價。然后從新丟入堆中。

    這是距離之和最遠,但是配對最多怎么辦,那么我們定義權(quán)值,小根堆維護權(quán)值。對于已經(jīng)匹配的右括號我們權(quán)值就是它的位置;對于沒有匹配的左括號,我們讓它的權(quán)值加上一個?inf-inf?inf就可以了。

    這樣就可以保證優(yōu)先匹配沒有匹配的且權(quán)值最大。

    時間復(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-二进制之谜【堆,贪心】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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