洛谷P2507 SCOI2008 配對

2021-09-25 21:54:14 字數 1088 閱讀 9969

走這裡思路源於題解第一篇

首先考慮此題若沒有不允許兩個相同的數配對這一條件,則好辦很多,直接分別排序後一一配對即可。

然後考慮有這一條件的情況:

注意到有\(ai\)不相同,\(bi\)也各不相同的條件,即如果當前匹配的兩個數是相同的,那麼調整其中乙個數為其相鄰的兩個數,就一定不會失配。因此我們先對兩個數列排一遍序,然後對於所得的結果進行調整即可。於是將\(a[i-1],a[i],a[i+1]\)與\(b[i-1],b[i],b[i+1]\)分別搭配即可。由於\(a[i+1]\)需要判上界,而\(f[1]\)和\(f[2]\)總需要被預先處理出來,所以這裡調整為處理\(i-2,i-1,i\)(都一樣)。

定義\(f[i]\)表示在匹配到第\(i\)對數時差值的最小值,那麼初始的\(f[i]=abs(a-b)\),之後用上述兩組數的所有任意搭配情況的差值結果與初始的\(f[i]\)比較取最小值,如果遇到匹配的兩個數是相等的情況,將結果賦為\(inf\)。

#include#define n (100000+5)

#define inf (1000000+7)

using namespace std;

int read()

while (isdigit(c))

return cnt * f;

}long long get(long long a, long long b)

long long n, a[n], b[n], f[n];

int main()

sort (a + 1, a + n + 1);

sort (b + 1, b + n + 1);

if (a[1] == b[1] && n == 1)

f[1] = get(a[1], b[1]);

f[2] = min(f[1] + get(a[2], b[2]), get(a[1], b[2]) + get(a[2], b[1]));

for (register int i = 3; i <= n; i++)

printf("%lld",f[n]);

}

洛谷P2474 SCOI2008 天平 題解

題目傳送門 題目大意 看題面吧。思考過程 具體做法 我也是看別人的題解才會做的。這個題真的很難往dp方面去想,但是想到了就特別簡單,用dn i j 表示i比j大的最小值,dx i j 表示i比j大的最大值 若j比i大,則這個值為負數 轉移請看 挺容易理解的,主要這個狀態真的想不到。include u...

洛谷 P4159 SCOI2009 迷路

如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...

洛谷 P2327 SCOI2005 掃雷

看起來我做的和其他題解不一樣 那就發一篇吧 首先本題情況看似無厘頭,但是仔細觀察,不難發現 我們可以假設第一種情況,接著可以推出第二種 然後有了兩個已知的後,第三個顯而易見 如果你要問我怎麼推出來的嗎,我在裡面說的的邏輯判斷已經很明白了 include include include include...