問題の意味
そこ\(N- \)整数\(a_iを、B_i \) (\(a_iを\)が変化し、\(B_i \)も異なる)、
\((1 \ルN- \ル10 ^。5、\ 1 \ルa_iを、B_i \ル^ 10 6)\) 、\(a_iを、b_j \) 、両者の同じ数は、最小数との差の絶対値の各和ことペアリングが必要、オフペアこの最小の出力。
思考
まず、\(、B \)小規模から大規模まで、Ruoguoは「同じ2つの数字が一致させることができない、」いないこの状態は、各ペアを置く\(a_iを、b_i \)のペアが最適でなければなりません。
以降(B \)\数字はそう等しいため、変化\(a_iを、\ B_i \) 、グループの数は3であってもよく、またはそれ以下、それを消化し
、それはさらに多くのと対にされた場合確かに最適ではありません、
だから、私たちは三つのグループを列挙することができます\(a_iを、b_i \)のすべての方法はオフにペアリングして、ライン上で最小を取ります。
コード
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+7;
const ll inf=1e17;
int n;
ll a[N],b[N],f[N];
int main(){
// freopen("match.in","r",stdin);
cin>>n; for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]);
sort(a+1,a+1+n); sort(b+1,b+1+n);
if(a[1]==b[1]) f[1]=inf;
else f[1]=abs(a[1]-b[1]);
if(a[1]==b[1]||a[2]==b[2]) f[2]=abs(a[2]-b[1])+abs(a[1]-b[2]);
else f[2]=abs(a[2]-b[2])+abs(a[1]-b[1]);
for(int i=3;i<=n;i++){
ll t1=inf,t2=inf,t3=inf,t4=inf,t5=inf;;
if(a[i]!=b[i]) t1=f[i-1]+abs(a[i]-b[i]);
if(a[i]!=b[i-1]){
if(a[i-1]!=b[i]) t2=f[i-2]+abs(a[i]-b[i-1])+abs(a[i-1]-b[i]);
if(a[i-1]!=b[i-2]&&a[i-2]!=b[i]) t3=f[i-3]+abs(a[i]-b[i-1])+abs(a[i-1]-b[i-2])+abs(a[i-2]-b[i]);
}
if(a[i]!=b[i-2]){
if(a[i-1]!=b[i]&&a[i-2]!=b[i-1]) t4=f[i-3]+abs(a[i]-b[i-2])+abs(a[i-1]-b[i])+abs(a[i-2]-b[i-1]);
if(a[i-1]!=b[i-1]&&a[i-2]!=b[i]) t5=f[i-3]+abs(a[i]-b[i-2])+abs(a[i-1]-b[i-1])+abs(a[i-2]-b[i]);
}
f[i]=min(min(t1,min(t2,t3)),min(t4,t5));
}
printf("%lld\n",f[n]);
return 0;
}