link
填填初二時研究過的坑(今天初二考試題)。相鄰交換法的應用。
跳過所有前面的簡化式子,從 $\min\$ 與 $\min\$ 分析。
若對於所有 $i但是這個東西可以用來寫 $cmp$ 函式嗎,答案是不能的。因為 $sort$ 時 $cmp$ 需要滿足是嚴格弱序的。
嚴格弱序需要滿足:
即通過條件唯一確定乙個序列的順序。
而對於上面的比較不滿足不可比傳遞性,如 $(10,10),(6,6),(7,9)$。
對於之前的國王遊戲最後推出的是 $\dfrac
而我們如何去處理這道題呢。
有乙個很便捷的做法是對於 $i,j$ 通過 $\min\$ 與 $\min\$ 建圖(需要滿足可以相鄰交換),按照其拓撲序排列即可。時間複雜度 $o(n^2)$ 。
考慮如何去優化這個事情。我們必須新增條件使得在 $\min\ = \min\$ 時合法(該式子滿足傳遞性)。 由於 $cmp$ 函式的設計必須與 $i,j$ 對稱所以猜一猜?
可以通過花費的時間寫程式驗證是否合法,即驗證傳遞性與不可比性的傳遞性。
#include#includeview code#include
#include
#include
#include
#include
#include
#define pii pair#define pb push_back
#define mp make_pair
#define fi first
#define se second
using
namespace
std;
inline
intread()
while(c>='
0'&&c<='9')
return f*ans;
}int a[4],b[4];bool ff=1
;bool cmp(int id1,int id2)
intmain()
if(ff) printf("
accepted\n");
return0;
}
使用時根據猜測改變 $cmp$ 函式並適當提高值域即可?若出現 $accepted$ 即為滿足嚴格弱序,可以直接使用。可以通過上述**構造反例。
故可以按照通過上述**的 $cmp$ 構造,時間複雜度 $o(n\log n)$ 。
#include#includeview code#include
#include
#include
#include
#include
#include
#define int long long
#define pii pair#define pb push_back
#define mp make_pair
#define fi first
#define se second
using
namespace
std;
inline
intread()
while(c>='
0'&&c<='9')
return f*ans;
}const
int maxn=1e6+11
;int
n,a[maxn],b[maxn],c[maxn],p[maxn],sum,maxn;
bool cmp(int id1,int id2)
signed main()
return0;
}
全排列 交換法
本人qq 1770115451 演算法 1061907071 請編寫乙個方法,確定某字串所有的排列組合,給定乙個字串,請返回該字串的所有排列 例如 abc 的全排列結果為 abc acb bac bca cab cba 題意 就是乙個字串的每乙個字元重新排列出的所有的結果 原理 假設以字串第0個位置...
C語言 交換法排序
交換法排序 題目內容 從鍵盤輸入n個 n 10 整數,用交換法進行排序 非遞減有序 結果輸出排序後的序列。說明 交換法排序用函式實現,函式原型為 void sort int a,int n 交換法排序的基本思想是 n個元素共需要n 1趟,其中第i 從0變化至n 2 趟的任務是找出本趟中最小的元素放在...
「序列數交換法」與加密
用 序列數交換法 可以產生真隨機數,但真隨機數用於加密檔案並不好用,用它們做金鑰需要保管和傳 遞等特殊關照,所以我們需要密碼學意義上的真隨機數就可以了,也就是對想破解的人是真的。現在籌畫序列數加密 隨機加密 這裡的加密方法是需要密碼的,密碼由使用者輸入。序列數由 序列數交 換法 產生,經處理後作為金...