描述
現在有"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...