との間の正数の2 つの配列 と が与えられA
ます。差の絶対値の合計が最小になるように、各整数を整数とペアにする必要があります。それぞれ最大 5000 個の整数を含めることができます。B
1
1,000,000
a
A
b
B
A
B
例えば:
A=[10, 15, 13]
とB=[14,13, 12]
の場合、最良のペアリングはと(10, 12)
で(15, 14)
あり、(13, 13)
これは私|10-12|+|15-14|+|13-13|=3
たちが達成できる最小のものです。したがって、達成される最小合計は です3
。
動的プログラミングの質問だと思います。
編集:
配列のサイズは異なる場合がありますが、それぞれ最大 5000 個の要素を含めることができます。
私のコード:
#include <cmath>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
static int DP[5002][5002], N, M, tmp;
vector<int> B, C;
int main()
{
scanf("%d %d", &N, &M); memset(DP, -1, sizeof DP);
B.push_back(0); C.push_back(0); DP[0][0]=0;
for(int i=1; i<=N; ++i){scanf("%d", &tmp); B.push_back(tmp);} \\inputting numbers.
for(int i=1; i<=M; ++i){scanf("%d", &tmp); C.push_back(tmp);}
sort(B.begin(), B.end()); sort(C.begin(), C.end()); \\Sorting the two arrays.
if(C.size()<=B.size()){ \\Deciding whether two swap the order of arrays.
for(int i=1; i<=N; ++i){
for(int j=1; j<=M; ++j){
if(j>i)break;
if(j==1)DP[i][j]=abs(C[j]-B[i]);
else{
tmp=DP[i-1][j-1]+abs(C[j]-B[i]);
DP[i][j]=(DP[i-1][j]!=-1)? min(tmp, DP[i-1][j]): tmp;
}
}
}
printf("%d\n", DP[N][M]); \\Outputting the final result.
}
else{
for(int i=1; i<=M; ++i){
for(int j=1; j<=N; ++j){
if(j>i) break;
if(j==1)DP[i][j]=abs(C[i]-B[j]);
else{
tmp=DP[i-1][j-1]+abs(C[i]-B[j]);
DP[i][j]=(DP[i-1][j]!=-1)? min(tmp, DP[i-1][j]): tmp;
}
}
}
printf("%d\n", DP[M][N]);
}
return 0;
}