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...