[SCOI2008]ペアリング問題解決レポート

【SCOI2008】ペアリング

問題の意味

そこ\(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;
}

おすすめ

転載: www.cnblogs.com/brucew-07/p/11807482.html