優先佇列是一種特殊的佇列,當元素入隊時不一定排在隊尾,而是根據規定的優先順序順序插入到不同的位置,相當於每插入乙個元素時根據優先順序對所有元素重新排序。
規定優先順序的方式與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暫...