配對 SCOI2008 動態規劃

2022-05-27 13:39:13 字數 1901 閱讀 8470

【題目描述】

你有\(n\)個整數\(a_i\)和\(n\)個整數\(b_i\)。你需要把它們配對,即每個\(a_i\)恰好對應一 個\(b_i\)。要求所有配對的整數差的絕對值之和盡量小,但不允許兩個相同的數配對。例如\(a=,b=\),則最優配對方案是\(5\)配\(8\), \(6\)配\(5\), \(8\)配\(7\),配對整數的差的絕對值分別為\(2, 2, 1\),和為\(5\)。注意,\(5\)配\(5\),\(6\)配\(7\),\(8\)配\(8\)是不允許的,因 為相同的數不許配對。

【輸入格式】

第一行為乙個正整數\(n\),接下來是\(n\)行,每行兩個整數\(a_i\)和\(b_i\),保證所有\(a_i\)各不相同,\(b_i\)也各不相同。

【輸出格式】

輸出乙個整數,即配對整數的差的絕對值之和的最小值。如果無法配對,輸出\(-1\)。

【資料範圍】

\(1 \le n \le 10^5\),\(a_i\)和\(b_i\)均為\(1\)到\(10^6\)之間的整數。

關於此題

沒想到吧!又是dp

首先 先對\(a,b\)陣列進行排序。如果沒有限制條件的話,明顯最優解就是排序後的每個a[i]和每個b[i]配對。

加上限制條件之後

對於某個位置\(i\)

\(1.\)如果\(a[i-1] = b[i-1]\) 那麼我們可以讓\(a[i-1]\)和\(b[i]\)配對,讓\(a[i]\)和\(b[i-1]\)配對。

\(2.\)如果\(a[i-1] = b[i-1]\) 且 \(a[i-2] = b[i-2]\) 那就可以讓\(a[i-2], b[i-1]\),\(a[i-1], b[i]\), \(a[i], b[i-2]\) 分別配對

或是讓\(a[i-2], b[i]\),\(a[i-1], b[i-2]\), \(a[i], b[i-1]\) 分別配對

\(3.\)如果有更多連續相等的,都可以把它們轉化成上面的兩種情況進行處理,不需要再分開考慮

得到轉移方程為

\(dp[i] = min(dp[i-1] + calc(a[i], b[i]), dp[i-2] + calc(a[i-1], b[i]) + calc(a[i], b[i-1]), dp[i-3] + calc(a[i-2], b[i-1]) + calc(a[i-1], b[i]) + calc(a[i], b[i-2]), dp[i-3] + calc(a[i-2], b[i]) + calc(a[i-1], b[i-2]) + calc(a[i], b[i-1]))\);

\(calc(x, y)\)在\(x = y\)時返回無窮大。

【**】

#include #include #include using namespace std;

typedef long long ll;

const ll inf = 0x3f3f3f3f3f3f3f3f;

ll n, a[100005], b[100005], dp[100005];

inline ll _abs(ll x)

inline ll calc(ll a, ll b)

int main()

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

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

dp[1] = calc(a[1], b[1]);

dp[2] = min(dp[1] + calc(a[2], b[2]), calc(a[1], b[2]) + calc(a[2], b[1]));

for (int i = 1; i <= n; i++)

if (dp[n] >= inf) puts("-1");

else printf("%lld\n", dp[n]);

return 0;

}

SCOI2008 配對 貪心 DP

description 你有n 個整數ai和n 個整數bi。你需要把它們配對,即每個ai恰好對應一 個bp i 要求所有配對的整數差的絕對值之和盡量小,但不允許兩個相同的數配 對。例如a b 則最優配對方案是5配8,6配5,8配7,配對整數 的差的絕對值分別為2,2,1,和為5。注意,5配5,6配7...

SCOI2008 著色方案

time limit 10 sec memory limit 162 mb submit 2228 solved 1353 submit status discuss 有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊...

SCOI2008 著色方案

給你 k 種顏料,每種顏料有 c 份,每份顏料塗一塊木板,求恰好用完所有顏料且相鄰兩木板顏色不同的塗色方案種數.1 leq k leq 15 1 leq c leq 5 由於此題資料較小,考慮dp套組合數學,但重複dp運算量極大,考慮記憶化搜尋優化.又因為每種顏料至多5份,模擬烏龜棋,我們可以開乙個...