Swust OJ 541 排列字典序問題

2022-05-13 03:59:23 字數 1584 閱讀 2093

time limit(ms): 2000      memory limit(kb): 65535

n個元素有n!個不同的排列。將這n!個排列按字典序排列,並編號為0,1,…,n!-1。每個排列的編號為其字典序值。例如,當n=3時,6 個不同排列的字典序值如下: 

0       1     2    3     4    5

123 132 213 231 312 321

description

第1 行是元素個數n(n < 15)。接下來的1 行是n個元素的乙個排列。

input

第一行是字典序值,第2行是按字典序排列的下乙個排列。

output12

82 6 4 5 8 1 7 3

sample input12

8227

2 6 4 5 8 3 1 7

sample output

解題思路:兩部曲(咳咳~~)

一題目例子為例

比2小的數有1個,則 tot+=1*7!;

比6小的數有4個,則 tot+=4*6!;

比4小的數有2個,則 tot+=2*5!;

比5小的數有2個,則 tot+=2*4!;

比8小的數有3個,則 tot+=3*3!;

比1小的數有0個,則 tot+=0*2!;

比7小的數有1個,則 tot+=1*1!;

比3小的數沒有;

在實際求解中可以通過減去前面比當前數小的數來確定後面當前數小的數(方便程式的編寫)

對於求下乙個序列,衝最後找,找到乙個比最後乙個數小的數把最後乙個數放在之前就可以了

當然懶人嘛(比如說我)就next_permutation()你值得擁有~~~

**如下

1 #include 2 #include 3

using

namespace

std;

4int

main()

524 cout << k <

25 next_permutation(p, p +n);

26for (i = 0; i < n; i++)

27 cout << p[i] << '';

28 cout <

30return0;

31 }

view code

用數字dp還是超時了(其實就這個狀態設計本身來說不超時才是怪事,不想多說),**先放在這裡

1

/*******************數字dp************************

*/2 #include 3 #include 4

using

namespace

std;56

int n, bit[11], vis[10

], flag;

7char s[11];8

9int dfs(int pos, bool

limit)

19return

ret;20}

2122

intmain()

view code

2 6 排列的字典序問題

問題描述 n 個元素有 n 個不同的排列。將這 n 個排列按字典序排列,並編號為 0,1,n 1。每個排列的編號為其字典序值。例如,當 n 3 時,6 個不同排列的字典序值如下 字典序值 0 1 2 3 4 5 排列 123 132 213 231 312 321 程式設計任務 給定 n 以及 n ...

hdu 1716 排列2 排列組合

問題描述 ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數 input 每組資料佔一行,代表四張卡片上的數字 0 數字 9 如果四張卡片都是0,則輸入結束。output 對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,...

197 排列序號

是 這道題採取暴力解法會超時,應當對於原陣列的每乙個位置找到其後有多少個數比它小,然後再相加這些數與對應的權的成績。class solution long long ans 1,fac 1,cc 1 for int i len 2 i 0 i ans fac cc c i return ans 注意...