牛客網做題筆記 洗牌問題

2021-07-22 04:38:15 字數 2660 閱讀 9315

洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。 現在需要洗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

我們主要需要執行的操作就是洗牌這個過程,將洗完的牌返回以供繼續洗牌,所以我們可以構造乙個洗牌函式,根據傳進來的引數給定其洗多少次,返回最後的那副牌即可。洗牌函式較簡單,所以這道題目不難。

#include

#include

#include

using

namespace

std;

vector

sort(vector

& res);

int main()

while(k)

for(int i = 0;i < res.size();i++)

vector

sort(vector

& res)

for(int i = 0;i < (r.size()/2);i++)

return r;

}

洗牌函式就是這麼乙個過程:

將傳進來的牌分成兩部分(0~i == i~size),因為給出的測試用例肯定是偶數,所以我們也不用擔心奇數情況,降低了難度

先將右邊的牌的最後一張放入到新的牌中,再將左邊的牌的最後一張放入,兩邊標記均往上跑一步

這麼重複,直到跳出迴圈,也就是沒牌的時候了

按照題目規則,將這些牌反序儲存在陣列中,就得到了新的一副牌

在主函式中,就是根據k的次數,執行k次洗牌過程,跳出k次洗牌這個過程之後,就將正確的結果輸出即可。

注:但是這個題目在牛客上還沒人用python做出過,我開始也是用python寫,因為list很適合這些陣列操作,但是最後發現不能按照它的要求輸出一行,貌似python只有print函式。(如果有了解的,希望提醒一下博主,萬分感謝。)

在別人**上更改過的python:

import sys

defxipai

(a,n):

r=[a[i+j*n] for i in range(n) for j in range(2)]

return r

while

true:

t = sys.stdin.readline().strip()

if t == '':

break

t = int(t)

if t > 100:

break

else:

for i in range(t):

s = sys.stdin.readline().strip()

[n,k]=s.split()

n=int(n)

k=int(k)

if n > 100

or k >100:

break

s = sys.stdin.readline().strip()

if s == '':

break

a=s.split()

r=a[:]

if len(r) != 2*n:

continue

while k>0

and k<=100

and len(r) == (2*n):

i+=1

r=xipai(r, n)

if r==a:

k=k%i

k-=1

if len(r) == (2*n):

for i in range(2*n-1):

print int(r[i]),

print r[2*n-1]

牛客上的這道題目貌似有點問題,貌似都是提示陣列越界或者非法訪問,在牛客的討論區也有一些人遇到這種類似的問題,望以後解決。

牛客網 洗牌問題

問題描述 洗牌在生活中十分常見,現在需要寫乙個程式模擬洗牌的過程。現在需要洗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 問題分析 在考慮空間和時間複雜度的情況下,該題目室友難度的。左神講解的座標連環懟方法我覺得很有意思,解決技...

牛客網做題總結(1)

在牛客網上做了一 些題,過來總結一下問題 1.陣列 二維陣列第一維長度代表每一列的元素個數,第二維代表每一行的元素個數且不能省略 2.關於類成員函式的過載,覆蓋和隱藏 題目 類成員函式的過載 覆蓋和隱藏區別描述正確的有?a.覆蓋是指在同乙個類中名字相同,引數不同 b.過載是指派生類函式覆蓋基類函式,...