配对
题目描述
你有 n 个整数Ai和n 个整数Bi。你需要把它们配对,即每个Ai恰好对应一个Bp[i]。要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对。例如A={5,6,8},B={5,7,8},则最优配对方案是5<->8, 6<->5, 8<->7,配对整数的差的绝对值分别为2, 2, 1,和为5。注意,5<->5,6<->7,8<->8是不允许的,因为相同的数不许配对。
输入
第一行为一个正整数n,接下来是n 行,每行两个整数Ai和Bi,保证所有 Ai各不相同,Bi也各不相同。
输出
输出一个整数,即配对整数的差的绝对值之和的最小值。如果无法配对,输 出-1。
样例输入
3
3 65
45 10
60 25
样例输出
32
提示
1 <= n <= 10^5,Ai和Bi均为1到10^6之间的整数。
#include<bits/stdc++.h> #define ll long long #define inf 1e15 using namespace std; const int maxn = 100010; int x[maxn],y[maxn]; ll pei[maxn]; ll dui(int a,int b) { if(x[a]==y[b]) return inf; return abs(x[a]-y[b]); } int main() { int n; scanf("%d",&n); for(int i=1; i<=n; ++i) scanf("%d%d",&x[i],&y[i]); sort(x+1,x+n+1); sort(y+1,y+n+1); for(int i=1; i<=n; i++) { pei[i]=inf; } pei[0]=0; for(int i=1; i<=n; i++) { pei[i]=min(pei[i],pei[i-1]+dui(i,i)); if(i>1) pei[i]=min(pei[i],pei[i-2]+dui(i-1,i)+dui(i,i-1)); if(i>2) { pei[i]=min(pei[i],pei[i-3]+dui(i-2,i-1)+dui(i-1,i)+dui(i,i-2)); pei[i]=min(pei[i],pei[i-3]+dui(i-2,i)+dui(i-1,i-2)+dui(i,i-1)); } } if(pei[n]>=inf) cout<<"-1"<<endl; else printf("%lld\n",pei[n]); return 0; }

浙公网安备 33010602011771号