魔法師與撲克牌遊戲 C 佇列題目

2021-10-02 15:29:53 字數 1627 閱讀 5189

開幕雷擊!奧里給!!哈哈,這是我搜到的一位大佬的程式,但不是最優,會超時。

#include

using

namespace std;

queue<

int> q;

int ans[

100010];

intmain()

}int len=0;

while

(q.empty()

==0)printf

("1 ");

for(

int i=len;i>=

1;i--

)printf

("%d "

,ans[i]);

return0;

}

來看一下題目描述:

題目描述

魔法師在玩一種撲克牌遊戲,n張撲克分別記上1,2,…,n。他開啟第一張是1,把它放在一邊。然後把最上面的兩張一張一張地依次移到最後,開啟上面一張剛好是2,再放在一邊;然後把上面的3張一張一張移到最後,開啟上面一張剛好是3,再放到一邊;……如此重複下去,直到開啟最後一張是n,放在一邊,這時他發現,放在一邊的撲克剛好是1,2,…n這樣排列的。

請程式設計輸出這些撲克原來是怎麼排列的。

輸入1行,乙個正整數n。

輸出1行,n個正整數,表示這些撲克牌原來的排列順序,每兩個數之間有乙個空格。

樣例輸入

5樣例輸出

1 4 5 2 3

提示輸入樣例2:

輸出樣例2:

1 8 6 2 9 4 5 3 7

資料範圍:

對於70%的資料:n<=100。

對於100%的資料:n<=10000.

上面那位大佬的程式會超時,在n=10000的地方肯定會超的。

苦思冥想後,我想出了乙個優化的辦法。那些ctrl c+ctrl v的人不要告訴他們,讓他們直接粘上面的(滑稽)

這個辦法呢,其實就是這樣的:

如果剩下的未輸入的數字比一半多,就說明肯定至少要轉一圈佇列。那麼其實只要轉 要轉的次數%剩下的個數 次,時間複雜度大大縮減了。

另外,如果上面的取余是0的話,就往前找乙個。

賦值的話不用再定義乙個bool陣列,原來陣列初始值0就可以了。

我要貼**了,ctrl c+ctrl v的人看這裡:

#include

using

namespace std;

int a[

10010

],j=

1,n;

intmain()

while

(a[j]!=0

);//終止情況,再往後找}if

(p!=-1

)a[j]

=i;//p=-1就是餘數為零的情況,餘數不為零我就賦值

if(p==-1

)dowhile

(a[j]!=0

);a[j]

=i;//餘數為0的操作

}for

(int i=

1;i<=n;i++

)printf

("%d "

,a[i]);

}

如果能幫到你,我很受榮幸!謝謝!

也許我的**不是最優,還請大神指導!

基於c 的撲克牌遊戲

建立一副撲克,並完成洗牌 發牌 顯示 花色排序 面值排序 刪除一張牌 刪除一輪牌等操作。本程式新建了perdeck和playdeck兩個類,類perdeck表示某個人拿的牌,類playdeck表示四個人玩牌的過程,對原程式的修改較小。程式中用到了包含在標頭檔案stdlib.h中的函式srand 用來...

C 小遊戲 撲克牌21點

21點撲克牌遊戲 程式說明 該程式是模擬21點撲克牌遊戲,玩家最多可以要5張牌,但是如果牌的點數之和超過21點,則自動出局,在不超過21點的情況下,玩家與莊家比牌的大小,大者為贏家 程式片段分析 標頭檔案處 include include include using namespace std cs...

C 16 多型版撲克牌遊戲

16 多型版撲克牌遊戲 16.1 多種牌墩 皮納克爾牌墩 只使用9到a的牌,但要使用兩副牌 這個牌只要48張牌,牌24到47重複牌0到23 的牌點和花色 class pinochledeck pinochledeck pinochledeck shuffle void pinochledeck sh...