臨項交換法在貪心演算法中的應用

2022-04-30 19:15:10 字數 1695 閱讀 5400

我們給出乙個高中常見的排序不等式:

對 \(a_1\leq a_2\leq ...... \leq a_n\) 且 \(b_1 \leq b_2 \leq ...... \leq b_n\),

設\(a_,a_, ...... ,a_},a_\)是數列\(\left\\)的乙個隨機排列,

那麼有如下不等式成立:

\[a_nb_1+a_b_2+......+a_nb_1\leq a_b_1+a_b_2+......+a_b_n\leq a_1b_1+a_2b_2+......+a_nb_n

\]即 逆序和 \(\leq\) 亂序和 \(\leq\) 順序和

其證明可以通過臨項交換法進行:

對於順序和,隨機挑選\(i,j(i兩項進行交換,即將\(a_ib_i+a_jb_j\)交換為\(a_ib_j+a_jb_i\)。

那麼\[(a_ib_i+a_jb_j)-(a_ib_j+a_jb_i)=(a_j-a_i)(b_j-b_i)\geq 0

\]可以說明對於順序和,任意選擇兩項進行交換都不會使得值更大

將其進行推廣,可以得出順序和最大

同理,對於逆序和,任意選擇兩項交換都不會使得值更小,推廣後得到逆序和最小

這樣我們便證明了上述結論

上述證明的核心在於臨項交換法:對乙個按某種順序排列的序列,證明任意兩項交換後都不會使得答案更優,則該順序排列是最優解,或者說,當兩項按某種順序排列後最優,大概率可以推廣到\(n\)項。這種方法常常用於以排序為基礎的貪心題的證明。

鏈結本來這個題目是藍題的,結果因為太經典,做的人太多,已經變成綠題了就離譜

思路記皇帝是第0個人,第\(i\)個人所得金幣數量為\(v_i\),那麼有

\[v_i=\frac^a_k}

\]我們的目標是使得\(ans=max\left\\)最小

臨項交換:我們先按某種方式進行排序,隨後隨意抽取相鄰兩項\((i,i+1)\)嘗試交換。

原本答案為\(ans=max(ans0,\frac^a_k},\frac^a_k}})\)

交換後變為\(ans=max(ans0,\frac^a_k}},\frac^a_k)*a_})\)

那麼我們比較一下\(\frac^a_k}}\)和\(\frac^a_k)*a_}\)的大小即可

約去公因式,即比較\(\frac}\)和\(\frac}\)即可

當\(a_ib_i\leq a_b_\)時,此時\(ans1\)不會大於\(ans2\),無需交換,否則交換後可以使答案不會變差(甚至變優)

那麼我們就得到了乙個排序思路:以\(a_ib_i\)作為排序依據,從小到大排序即可

**略,洛谷題解挺多的了(這題好像還要寫一下高精度才能完全ac)

1.2023年河海acm選拔賽低年級組h題 刷題狂魔

可以看下我前面寫的部落格

2.洛谷p1012 拼數

臨項交換法:把\(n\)個數字按照字串讀入,按某一順序排列,嘗試將相鄰兩項\((a,b)\)進行交換,可以發現當\(a+b\geq b+a\)(注意,這裡時按照字串方式進行加減,類似於拼接,而不是算術加法)時無需交換,反之交換後可以使得答案更優。**如下:

#includeusing namespace std;

string a[21];

bool cmp(string a,string b)

int main()

全排列 交換法

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

相鄰交換法 皇后遊戲

link 填填初二時研究過的坑 今天初二考試題 相鄰交換法的應用。跳過所有前面的簡化式子,從 min 與 min 分析。若對於所有 i但是這個東西可以用來寫 cmp 函式嗎,答案是不能的。因為 sort 時 cmp 需要滿足是嚴格弱序的。嚴格弱序需要滿足 即通過條件唯一確定乙個序列的順序。而對於上面...