相鄰交換法 皇后遊戲

2022-05-08 19:24:10 字數 1813 閱讀 2291

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#include

#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;

}

view code

使用時根據猜測改變 $cmp$ 函式並適當提高值域即可?若出現 $accepted$ 即為滿足嚴格弱序,可以直接使用。可以通過上述**構造反例。

故可以按照通過上述**的 $cmp$ 構造,時間複雜度 $o(n\log n)$ 。

#include#include

#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;

}

view code

全排列 交換法

本人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 趟的任務是找出本趟中最小的元素放在...

「序列數交換法」與加密

用 序列數交換法 可以產生真隨機數,但真隨機數用於加密檔案並不好用,用它們做金鑰需要保管和傳 遞等特殊關照,所以我們需要密碼學意義上的真隨機數就可以了,也就是對想破解的人是真的。現在籌畫序列數加密 隨機加密 這裡的加密方法是需要密碼的,密碼由使用者輸入。序列數由 序列數交 換法 產生,經處理後作為金...