牛客網 洗牌問題

2021-10-01 03:49:34 字數 1693 閱讀 2105

問題描述

洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。

現在需要洗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次之後從上往下的序列。 輸入描述: 第一行乙個數t(t ≤

100),表示資料組數。對於每組資料,第一行兩個數n,k(1 ≤ n,k ≤ 100),接下來一行有2n個數a1,a2,…,a2n(1 ≤

ai ≤ 1000000000)。表示原始牌組從上到下的序列。

輸出描述:

對於每組資料,輸出一行,最終的序列。數字之間用空格隔開,不要在行末輸出多餘的空格。

輸入例子:3

3 11 2 3 4 5 6

3 21 2 3 4 5 6

2 21 1 1 1

輸出例子:

1 4 2 5 3 6

1 5 4 3 2 6

1 1 1 1

問題解析

首先,定義乙個二維陣列,每一行儲存每組牌,在fun函式中,定義兩個棧。由於棧的先入後出的性質,所以天然逆序。

兩個棧中分別儲存左右牌和右手牌,同時從兩個棧中拿牌儲存在乙個陣列中,先出右手再出左手的牌。完了之後,逆置一下,將順序調整。

這樣就可以拿到每組牌洗過之後的牌,如果多次洗牌就重複多次。

**描述

#include

#include

#include

#include

using

namespace std;

vector<

int>

fun(

int n,

int k)

while

(k--

)for

(i = n; i <

2* n; i++

) ret.

clear()

;for

(i =

0; i < n; i++

)reverse

(ret.

begin()

, ret.

end())

;}return ret;

}int

main()

for(

int i =

0; i < arr.

size()

; i++

) cout << endl;

}return0;

}

牛客網做題筆記 洗牌問題

洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最後一張牌,...

牛客網演算法筆記 完美洗牌問題

引用 左神 問題描述 假設有長度為2 n的陣列 a1,a2,a3,an,b1,b2,b3,bn 洗牌後的順序為 b1,a1,b2,a2,bn,an 要求 空間複雜度為o n 時間複雜度為o 1 問題分析 在考慮空間和時間複雜度的情況下,該題目室友難度的。左神講解的座標連環懟方法我覺得很有意思,解決技...

牛客 程式設計題 洗牌C

鏈結 洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張 上半堆 右手拿著第n 1張到第2n張 下半堆 接著就開始洗牌的過程,先放下右手的最後一張牌,再放下左手的最後一...