網易有道2017內推程式設計題

2022-08-24 22:48:12 字數 2166 閱讀 8403

沒有報有道,在牛客上做的。。。

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次之後從上往下的序列。

輸入描述:

第一行乙個數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

解析:找了一下規律,把每一步是怎麼變的描述出來就可以了,第二步生成的陣列用第一步中的索引來表示的話就是這樣的順序(注意為了方便陣列從索引1處開始存放):a[1],a[n+1],a[2],a[n+2],...a[n],a[2n]。

#include #include 

#include

using

namespace

std;

intmain( )

a=tmp;

}cout

<1

];

for(p=2;p<=2*n;p++)

cout

<<"

"

<}

return0;

}

2、構造佇列

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

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

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

小明同學發現,這段程式恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的佇列,你能做到嗎?[注:原題樣例第三行5有錯,應該為3,以下已修正]

輸入描述:

第一行乙個整數t(t ≤ 100)表示資料組數,每組資料輸入乙個數n(1 ≤ n ≤ 100000),輸入的所有n之和不超過200000。

輸出描述:

對於每組資料,輸出一行,表示原始的佇列。數字之間用乙個空格隔開,不要在行末輸出多餘的空格.
輸入例子:
412

310

輸出例子:
1

2 12 1 3

8 1 6 2 10 3 7 4 9 5

解析:題目while迴圈中做了兩件事,1將隊頭元素挪到隊尾,2輸出隊頭元素並彈出。要還原佇列,則需要將程式中做的事情進行逆向處理:1將插入的元素插入隊頭,2將隊尾元素挪到隊頭,因為最後輸出的順序是1~n,所以插入的順序應該為n~1.

#include #include 

#include

#include

#include

using

namespace

std;

intmain( )

cout

<0

];

for(int i=1;i)

cout

<<"

"

<}

return0;

}

網易有道2017內推程式設計題

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

網易有道2017內推程式設計題

include include include include include include include include include include include include include include accmulate include include setprecision...

網易有道2017內推程式設計題

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