開幕雷擊!奧里給!!哈哈,這是我搜到的一位大佬的程式,但不是最優,會超時。
#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...