演算法競賽入門經典 STL資料結構的使用

2021-07-17 01:41:09 字數 3051 閱讀 6725

1.洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。 現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張(上半堆),右手拿著第n+1張到第2n張(下半堆)。接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最後一張牌,接著放下右手的倒數第二張牌,再放下左手的倒數第二張牌,直到最後放下左手的第一張牌。接著把牌合併起來就可以了。 例如有6張牌,最開始牌的序列是1,2,3,4,5,6。首先分成兩組,左手拿著1,2,3;右手拿著4,5,6。在洗牌過程中按順序放下了6,3,5,2,4,1。把這六張牌再次合成一組牌之後,我們按照從上往下的順序看這組牌,就變成了序列1

,4,2,5,3,6。 現在給出乙個原始牌組,請輸出這副牌洗牌k次之後從上往下的序列。

思路使用棧(這裡沒有用到stl 容器)

#include#include#includeusing namespace std;

int stack[200+10];

int stack1[100+10];

int stack2[100+10];

int length=0;

int length1=0;

int length2=0;

int main()

length=2*n;

while(k--)

//和牌

}//輸出棧(自頂向下)

while(length>1)

printf("%d\n",stack[--length]);

}//system("pause");

return 0;

}

2.

小明同學把1到n這n個數字按照一定的順序放入了乙個佇列q中。現在他對佇列q執行了如下程式:

while(!q.empty())              //佇列不空,執行迴圈

做取出隊頭的值操作的時候,並不彈出當前隊頭。

小明同學發現,這段程式恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的佇列,你能做到嗎?

解題思路:把該過程逆向(使用雙端佇列實現)

#include#include#includeusing namespace std;

#includeint main()

//從隊頭到隊尾,依次輸出

while(q.size()>1)

{cout《已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號1開始報數,數到k的那個人出列;他的下乙個人又從1開始報數,數到k的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 

例如n=10,k=3時,輸出的出列順序是3,6,9,2,7,1,8,5,10,4。

解題思路,典型的使用鍊錶實現。stl中煉表實現方式有多種,這裡使用vector

#include#includeusing namespace std;

int main()

{ vectora; //定義向量物件a

int n,k,x=0;

cout<<"請輸入總人數n和出環位置k:"<>n>>k;

for(int i=0; i

看到這裡,讀者應該能發現,在程式設計過程中使用現成的資料結構實現,能減少程式設計的麻煩,演算法思路更加明確

這裡做乙個簡單的總結,總結程式設計構成中常用的stl

1)。棧 stack

#include 

//引入棧

在stl中棧一共就5個常用操作函式(

top()、push()、pop()、 size()、empty() 

),很好記的。

定義乙個stack的變數     stacks   //例如  stack q,q,、、

入棧,如例:s.push(x);

出棧,如例:s.pop();注意,出棧操作只是刪除棧頂元素,並不返回該元素。

訪問棧頂,如例:s.top()

判斷棧空,如例:s.empty(),當棧空時,返回true。

訪問棧中的元素個數,如例:s.size()

2)佇列

定義乙個queue的變數     queuem   //例如  queue q,q,、、

檢視是否為空範例        m.empty()    是的話返回1,不是返回0;

從已有元素後面增加元素   m.push()

輸出現有元素的個數      m.size()

顯示第乙個元素          m.front()

顯示最後乙個元素        m.back()

清除第乙個元素          m.pop()

3)雙端佇列

使用deque容器之前必須加上標頭檔案:#include;

dequec 建立乙個空的deque;

c.front()返回c容器的第乙個元素

c.back()返回c容器的最後乙個元素

c.size()返回c容器中實際擁有的元素個數

c.push_back(num)在末尾位置插入元素

c.pop_back()刪除末尾位置的元素

c.push_front(num)在開頭位置插入元素

c.pop_front()刪除開頭位置的元素

另外常用的還有:

c.insert(pos,num)在pos位置插入元素num

c.erase(pos)刪除pos位置的元素

下面看一道經典的約瑟夫環的題

問題描述:

已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號1開始報數,數到k的那個人出列;他的下乙個人又從1開始報數,數到k的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 

例如n=10,k=3時,輸出的出列順序是3,6,9,2,7,1,8,5,10,4。

#include#includeusing namespace std;

int main()

{ dequea; //定義向量物件a

int n,k,x=0;

cout<<"請輸入總人數n和出環位置k:"<>n>>k;

for(int i=0; i

演算法競賽入門經典筆記(二) STL

演算法競賽入門經典 第2版 學習筆記 1.排序 include include using namespace std int main sort a,a n 排序 int p lower bound a,a 10,2 在已排序的陣列中找2的位置sort可以對任意物件進行排序,可以使用sort a,...

演算法競賽入門經典 C 入門

include 提供輸入輸出流 include 提供常用演算法 using namespace std const int maxn 100 10 int a maxn int main return0 宣告陣列時,陣列大小可以用const宣告的常數。在c 中,這樣的寫法更加推薦。include i...

演算法競賽入門經典 1

想著要學演算法已經很長時間了,但一直都是有問題自己想,很少受 正規軍 編排,網上關於演算法的書倒是不少,其一必推 演算法導論 還有一本 演算法競賽入門經典 作者劉汝佳,好了,步入正題,兩天時間從第一章到第三章結尾,算是對c又進行了一遍複習,說一下新得 3d 3d 03d 知道它們的區別嗎,在呼叫pr...