2023年2月13日 林大OJ習題 優先佇列

2021-10-02 19:16:59 字數 3412 閱讀 9735

優先佇列是一種特殊的佇列,當元素入隊時不一定排在隊尾,而是根據規定的優先順序順序插入到不同的位置,相當於每插入乙個元素時根據優先順序對所有元素重新排序。

規定優先順序的方式與sort函式相似,用greater與less,需要注意的是含義相反。

priority_queue<

int,vector<

int>

,greater<

int>

>q;

//從小到大排列,與sort的greater相反

priority_queue<

int,vector<

int>

,less<

int>

>q;

//從大到小排列

priority_queue<

int,vector<

int>

>q;

//不加預設從小到大排列

結構體的優先佇列與之類似,自定義比較結構體需要過載運算子(啥意思咱也不懂,當成模版背下來就行了),其作用與sort函式中的cmp作用相似。

struct node

;priority_queue

>q;

bool

operator

<

(const node &s1,

const node &s2)

//優先佇列的排序模版,即過載運算子

這兩道題實質上是同一道題,關鍵是多組輸入時記得初始化與清空佇列。

直接放多組輸入時的**了。

#include

using

namespace std;

priority_queue<

int,vector<

int>

,greater<

int>

>q;

intmain()

ans=0;

while

(q.size()

>1)

cout

pop();

}return0;

}

優先佇列中存放結構體的模版題。

#include

using

namespace std;

int n,x;

struct node

;bool

operator

<

(const node &s1,

const node &s2)

priority_queue

>q;

intmain()

);}double tim=

0,ans=0;

while

(!q.

empty()

)printf

("%.2lf\n"

,ans/

(1.0

*n))

;return0;

}

直播講解的題目,但後半段就一臉懵逼了,看了題解以後才差不多能理解含義。

以下為jwgg的題解:

首先,把a和b兩個序列分別從小到大排序,變成兩個有序佇列。這樣,從a和b中各任取乙個數相加得到n2個和,可以把這些和看成形成了n個有序表/佇列:

a[1]+b[1] <= a[1]+b[2] <= … <= a[1]+b[n]

a[2]+b[1] <= a[2]+b[2] <= … <= a[2]+b[n]

a[n]+b[1] <= a[n]+b[2] <= … <= a[n]+b[n]

接下來,就相當於要將這n個有序佇列進行合併排序:

首先,將這n個佇列中的第乙個元素放入乙個優先佇列中;

然後,每次取出堆中的最小值。若這個最小值來自於第k個佇列,那麼,就將第k個佇列的下乙個元素放入堆中。

時間複雜度:o(nlogn)。

#include

using

namespace std;

typedef

long

long ll;

const

int n=

4e5+10;

int n,a[n]

,b[n]

;struct node

;bool

operator

<

(const node &s1,

const node &s2)

priority_queue

>q;

intmain()

);for(

int i=

1;i<=n;i++))

;}return0;

}

思路與上一題基本相同。

#include

using

namespace std;

char s[10]

;int k,id,tim;

struct node

;bool

operator

<

(const node &s1,

const node &s2)

priority_queue

>q;

intmain()

);} cin>>k;

while

(k--))

;}return0;

}

相當於合併果子的逆過程,還有就是答案需要用long long接收。

#include

using

namespace std;

priority_queue<

int,vector<

int>

,greater<

int>

>q;

intmain()

int t1,t2;

while

(q.size()

>1)

printf

("%lld\n"

,ans)

;return0;

}

優先佇列基本操作(優先佇列的底層資料結構就是堆)。洛谷資料量比較大,用cin輸入取消同步流依然會tle,推薦scanf輸入。

#include

using

namespace std;

priority_queue<

int,vector<

int>

,greater<

int>

>q;

intmain()

if(f==2)

cout

)

q.pop();

}return0;

}

2023年2月18日 林大OJ習題 set

set相當於乙個自動排序 自動去重的陣列,即插入時會自動排序,插入重複元素時不會變化。set的元素訪問需要用到迭代器,其原理可以模擬普通迴圈中的迴圈變數i。set的模版題,set的特點在排序和去重。include using namespace std set int a intmain print...

2023年2月8日 OJ習題

這類題的常規思路是結構體排序,但是本題由於並沒有多種元素,因此用不著結構體,僅僅是陣列排序就可以 include using namespace std int n,m,o int f 110 bool cmp int a,int b intmain return0 先打表,然後直接些就好了 inc...

2023年2月15日 考試

一如既往的菜。關鍵是轉換的方法 include using namespace std typedef long long ll struct sh bool operator const sh a,const sh b priority queue q int n ll x,y,z x是原數,z暫...