前陣子窩在宿舍打第一次比賽的時候就遇到關於字典序列的問題,昨天不禁腦洞大開,覺的關於字典排序還有很多東西是值得思考的。。。。。。
比如現在給你一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介面。當你通過繼承乙個現有的類來定義你需要被序列化的類,如果這個父類實...