關於字典序列問題的乙個腦洞

2021-06-21 22:07:18 字數 1572 閱讀 3258

前陣子窩在宿舍打第一次比賽的時候就遇到關於字典序列的問題,昨天不禁腦洞大開,覺的關於字典排序還有很多東西是值得思考的。。。。。。

比如現在給你一n長度的字典序列 讓它完全排布開來 如

當我給你231這一子列的時候 如何確定它在上述集合中的位置呢??

也就是如何知道231在上述集合中是排在第4的位置上的

假設有n位字典序列,第i位的數字記為

num[i];

那麼這個num[i]在num[i]到num[n]中由小到大排列後的序列號 記為

rank[i]

例如 一串數字   53214 中

rank[1]=5   因為53214排序後為12345

rank[2]=3   因為3214排序後為1234

rank[3]=2   因為214排序後為124

rank[4]=1   因為14排序後為14

rank[5]=1   因為4排序後為4

那麼 當給你一串長度為n的字典排列的時候,如何求出它在這個排列表裡的排名呢?經過總結後得出以下的計算公式

自行取例進行驗證

對於通過程式求出字典子列的序列號,具體的演算法過程描述如下

給定你一串長度為n的字典子列,p1 p2 p3 p4...........pn;

1.構造乙個長度也為n的一維陣列num[n+1]並將上述字典子列存貯在這個二維陣列中

如num[1]=p1,num[2]=p2,num[3]=p3........num[n]=pn,

2.逐個逐個求出rank[i],即求出p1在p1到pn的位置,p2在p2到pn的位置。。。。。。。。。

3.在進行逐個逐個求和;

具體**的實現如下,

#include

using namespace std;

const int max=10;

int a[max+1];

int b[max+1];

int rank[max+1];

int factorial(int n);

int main( )

int n,m,i,j;

while(cin>>n)

long long sum=1;

m=n;

for( i=1;i<=n;i++)

cin>>a[i];

for( i=1;i<=n;i++)

b[i]=i;

for( i=1;i<=n;i++)

for( j= 1;j<=m;j++)

if(a[i]==b[j])

rank[i]=j;

if(j != m)

while( j != m )             

--m;

break;

for( i=1;i<=n-1;i++)

sum+=(rank[i]-1)*factorial(n-i);

cout

int factorial(int n)

return n==0?1:factorial(n-1)*n;

乙個關於超級英雄題材電影劇本的腦洞

問題 電影的大反派boss智商太弱雞,無法烘托出我們的轉基因超級英雄男主角的光輝形象,怎麼辦呢?以下是阿群的假想乙個劇本,不喜勿噴 在電影的結尾,同往常差不多,反派boss再一次被消滅,世界又一次恢復了昔日的和平與寧靜。隨著超級英雄拯救地球的次數越來越多,人們漸漸對此習以為常,甚至視而不見。超 me...

腦洞大的日本人,做了乙個AI智慧型觀音講佛經!

據報道,日前,日本高台寺展示了智慧型機械人觀音 minder,旨在向現代人簡單易懂的闡明佛教的教義。據了解,minder 由大阪大學教授石黑浩等人協助研發,研發費用為 1 億日元 約 600 萬人民幣 外形方面,minder 高約 195 厘公尺 重約 60 公斤,頭部 手臂和軀體可以轉動,左眼內裝...

乙個關於反序列化的小問題

大家都知道,我們具有三種定義可序列化型別的方式 在型別上應用serializableattribute特性 應用datacontractattribute datamemberattribute特性和實現iserializable介面。當你通過繼承乙個現有的類來定義你需要被序列化的類,如果這個父類實...