配对

题目描述

你有 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;
}

 

posted @ 2018-02-08 20:59  轻狂上邪  阅读(166)  评论(0)    收藏  举报