撲克牌魔術(雙端隊列)

描述

東哥是個鄉村魔術師,COVID-19疫情期間閒來無事,用撲克牌給鄰居們表演了一場小魔術:

他將一疊預先洗好的撲克牌背面朝上拿在手中,先將最上面的撲克牌放到最下面,然後打開現在最上面的這張撲克牌,並放到邊上,這是一張1;

然後又將最上面的撲克牌放到最下面,再次打開最上面的撲克牌,這次是一張2;

他依次重複這兩個步驟:(1)將最上面的放到最下面,(2)打開最上面的這張撲克牌,最終打開的撲克牌依次是:1,2,3,4……

鄰居們都猜不出原來這疊撲克牌是怎麼放的,現在請你幫忙用計算機算一下,東哥手上這疊牌從上往下是怎麼排的呢?

例如東哥手上有10張撲克牌,則一開始撲克牌應該是這麼放的:

8 1 6 2 10 3 7 4 9 5

又比如有13張撲克牌,則一開始撲克牌的順序應該是:

7 1 12 2 8 3 11 4 9 5 13 6 10

格式

輸入格式

輸入只有一個數據n(2≤n≤1000),表示撲克牌的張數

輸出格式

輸出一行數據,表示撲克牌原來的順序

樣例

輸入樣例

5

輸出樣例

3 1 5 2 4 

限制

時間限制:100 ms

內存限制:32767 KB

提示

把這疊牌想象成一個隊列

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	scanf("%d",&n);
	deque<int> Q;
	Q.push_back(n);
	int temp;
	while(--n)
	{
		if(n == 0)
		break;
		Q.push_front(n);
		temp = Q.back();
		Q.pop_back();
		Q.push_front(temp);

	}
	while(Q.size()!=1)
	{
		temp = Q.front();
		Q.pop_front();
		printf("%d ",temp);
	}
	temp = Q.front();
	printf("%d",temp);

	return 0;



}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章