【題目描述】
你有\(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份,模擬烏龜棋,我們可以開乙個...