這次我們講普通的隊列問題,不是BFS。

所以我選了1332、1334兩道例題,先做解題報告。
由于時間原因,我先放個代碼,思路晚點補。
1332:直接模擬,也可以用循環(huán)隊列做。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
int main()
{
? queue<int> q1,q2;
? cin>>n>>m;
? for(int i=1; i<=n; i++) q1.push(i);
? for(int i=1; i<=m; i++) q2.push(i);
? cin>>k;
? while(k--)
? {//每組兩人
? ? cout<<q1.front()<<" "<<q2.front()<<endl;//輸出計劃
? ? q1.push(q1.front());
? ? q2.push(q2.front());//回到隊尾
? ? q1.pop();
? ? q2.pop();//同時出隊
? }//模擬算法,加上“循環(huán)隊列”思想(其實stl的普通隊列的空間跟數(shù)組循環(huán)隊列一樣)
? return 0;
}
總結(jié)一下,模擬算法,其實很簡單,熟練用了queue,就可以了。
循環(huán)隊列,參見“特殊隊列2”,這里就不提了。
1334:也是模擬,其實隊列就兩大類題:模擬和BFS(寬搜)
#include <bits/stdc++.h>
using namespace std;
queue<int> q;//定義隊列
int n,m,tot;
int main()
{
? cin>>n>>m;
? for(int i=1; i<=n; i++) q.push(i);//入隊
? tot=1;
? while(!q.empty())
? {
? ? if(tot%m==0)//如果到了出隊人數(shù)
? ? {
? ? ? cout<<q.front()<<" ";//輸出
? ? ? q.pop();//出隊
? ? }
? ? else
? ? {
? ? ? q.push(q.front());
? ? ? q.pop();
? ? ? //循環(huán)隊列思想,每完成一人,把這人放到隊尾
? ? ? //可以參考1332代碼,幾乎一樣的手法
? ? }
? ? tot++;//計數(shù)
? }
? cout<<endl;//這個回車可有可無
? return 0;
}
總結(jié),模擬類,多按題目順序來就行了,一般會用的人,不會錯。反是高深算法要當心。
我發(fā)現(xiàn)呵,似乎大家更愛看知識型的,不愛解題報告,但是解題報告往往是抄代碼必備神器。
所以嘛,我會多在解題報告中加上干活型內(nèi)容。
這次隊列題,最大感觸是:循環(huán)隊列思想真夠不錯的。其實循環(huán)隊列,完全不必要數(shù)組,過了n,變成1,就把頭的一扔,尾巴一推,就達成循環(huán)隊列了。
那么這次就到這里,時間不夠,簡單一些,望體諒。