假設我們將序列中第i件物品的引數定義為ai,那麼排序就是指將a1,…,an從小到大排序。若iaj,則就為乙個「逆序對」。sort公司是乙個專門為使用者提供排序服務的公司,他們的收費標準就是被要求排序物品的「逆序對」的個數,簡稱「逆序數」。
grant是這家公司的排序員,他想知道對於n個引數都不同的物品組成的序列集合中,逆序對數為t的物品有多少個,並試給出其中乙個最小的物品序列。所謂最小,即若有兩個物品序列(a1,a2,…,an),(b1,b2,…,bn),存在1≤i≤n,使得(a1,a2,…,ai-1)=(b1,b2,…,bi-1)且ai<bi。
輸入格式:
即兩個整數n和t ( 1≤n≤20,0≤t≤n*(n-1)/2 )。
輸出格式:
第一行表示n個引數都不通的物品組成的序列集合中,逆序數為t的序列個數;
第二行是所求物品引數序列。假設n個物品分別為1到n。
輸入樣例#1:
複製
4 3
輸出樣例#1:
複製
61 4 3 2
洛谷題解:
第一小問動歸解決;
第二小問只交換相鄰兩數達到使逆序對只加一的目的。
時間複雜度o(tn)
1 #include2 #include3inti,j,k,n,t,p;
4long
long f[21][211];5
int ans[21];6
short rec[21];7
int swap(int &a, int &b)813
intmain()
1422 f[2][1]=1; f[2][0]=1;23
for (i=3; i<=n; i++)
24for (j=0; j<=i*(i-1)/2; j++)
25for (k=0; k)
26if (j>=k)
27 f[i][j]+=f[i-1][j-k];
28 printf("
%lld\n
",f[n][t]);
29for (i=1; i<=n; i++)
30 ans[i]=i;
31for (i=1; i<=t; i++)
3237
int a=p-1,b=rec[ans[p-1]+1
];38
swap(a,b);39}
40for (i=1; i<=n; i++)
41 printf("
%d "
,ans[i]);
42return0;
43 }
P1347 排序(拓撲排序)
題目傳送門 這題雖然是一道藍題,但他的資料很小,所以,我們可以每輸入乙個關係就拓撲一次 我們可以把結果分為三種情況 這裡我們可以用拓撲把度清零,記錄每個字母都出現過 並且判斷最長的鏈是多少就行了 即f a i to max f a i to f p h 1 找最長鏈 s max s,f a i to...
洛谷P1347 排序
這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq.令dis x 表示x的相對大小 1是最小,n是最大 顯然,對於乙個關係a 而我們最後要求的就是dis x 的最小值,為了使它們的值都落在1 n之間,我們新建乙個虛擬的點0,並令dis 0 0且dis x dis 0 這...
洛谷 P1347 排序 拓撲排序
題目 乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列a,b,c,d 表示a第一行有兩個整數n,m,n表示需要排序的元素數量,2 n 26,第1到n個元素將用大寫的a,b,c,d 表示。m表示將給出的形如a接下來有m行,每行有3個字元,分別為乙個大寫字母,乙個 ...