題目大意:有這樣乙個排序:
for(cnt=0;!_sorted_(a,n);cnt++)
for(int i=n-1;i;i--) if(a[i]>a[i+1]) swap(a[i],a[i+1]);
給定n,問在所有排列p中,第k小的滿足執行上述**後cnt=m的排列是啥。n<=20。
題解:結論是,給定乙個排列,那個cnt就是,對每個位置求後面有多少個數字比這個數字小,的max。f(n,m)表示n個數cnt不超過m的方案數是小學生計數。然後逐位列舉確定即可。
#include
#include
#include
#include
#define lint long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using
namespace
std;
int del[30],ans[30];
inline lint fac(int n,lint ans=1)
inline lint _pow_(int a,int b,lint ans=1)
inline lint f(int n,int m)
inline
int kth(int k,int p=1)
int main()
rep(i,1,n) rep(j,1,min(n-i+1,m+1))
}rep(i,1,n) printf("%d ",ans[i]);return !printf("\n");
}
氣泡排序 排序 氣泡排序
既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...
氣泡排序 氣泡排序法
冒泡法是一種簡單的排序方法,它的實現非常簡單。首先對n個專案進行掃瞄,比較相領兩個專案的大小,若發現違背大小次序則進行互換,由此可以使n個專案中的最大者換到最後。然後對剩下的未排序好的專案再進行掃瞄,使它們的最大者換到表的最後。以此類推,直到將表全部排序好為止。這種排序方法,每遍掃瞄以後,都縮短了待...
選擇排序,氣泡排序,雙向氣泡排序
氣泡排序和選擇排序是最基本的排序方式,要掌握。氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。選擇排序每一趟從待排序的 資料元素 中選出最小 或最大 的乙個元素,順序放在已排好序的數列的...