(康托展開解釋) NYOJ 139 我排第幾個

2021-08-07 21:35:46 字數 1149 閱讀 4513

描述

現在有"abcdefghijkl」12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?

輸入

第一行有乙個整數n(0

輸出輸出乙個整數m,佔一行,m表示排列是第幾位;

樣例輸入

3

abcdefghijkl

hgebkflacdji

gfkedhjblcia

樣例輸出

1

302715242

260726926

**

[苗棟棟]原創

上傳者苗棟棟

做這道題,請尊重你的第一想法,對,沒錯。就是按每一位來計算小於它的個數,然後相加。

比如·第一位是3 1 2 ,然後·就有比第一位3小的有2個 ,則有2*2!就是 123 132    213 231.......

按照這種思維有乙個科學方法:康托展開

先看一下它的公式:x=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!

試試看,能看懂嗎??

x為在這個排列之前的個數,最後別忘了加1哦

n為陣列的長度;

a[n]是比第一位數小的個數,

注意這裡從0開始

。(n-1)就不用解釋了吧

理解了就好做了,

最後可以先把1~12的竭誠用陣列存起來,然後對於每一位i,有f[12-i]*t        t相當於a[i],比第i位小的個數;

**如下:

#includechar s[15];

int n;

int main()

scanf("%d",&n);

while(n--)

sum += f[12 - i] * t; //相當於t=a[n]*(n-1)+......... n-1==f[12-i] t==a[n];

}printf("%d\n",sum+1); //別忘了加1

}return 0;

}

nyoj 139 我排第幾個(康托展開)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...

NYOJ 139 我排第幾個(康托展開)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 abcd...

nyoj 139 我排第幾個 數學 康托展開

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 現在有 abcdefghijkl 12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?輸入 第一行有乙個整數n 0 輸出輸出乙個整數m,佔一行,m表示排列是第幾位 樣例輸入 3 ab...