#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long INF=1e18;
struct node
{
int val,lo;
bool operator<(const node &x)const
{
return val<x.val;
}
}a[4060],b[4060];
long long dp[4060];
int res[4060];
bool path[4060][4060];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].lo=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i].val);
b[i].lo=i;
}
sort(a+1,a+1+n);
sort(b+1,b+1+m);
for(int i=0;i<=n;i++)
dp[i]=INF;
dp[1]=abs(a[1].val-b[1].val);
path[1][1]=1;
for(int i=2;i<=n;i++)
for(int j=min(i,m);j>=1;j--)
{
if(dp[j]<dp[j-1])
{
dp[j]=dp[j]+abs(a[i].val-b[j].val);
path[i][j]=1;
}
else
{
dp[j]=dp[j-1]+abs(a[i].val-b[j].val);
path[i][j]=0;
}
}
printf("%lld\n",dp[m]);
res[a[n].lo]=b[m].lo;
int t=path[n][m]?m:m-1;
for(int i=n-1;i>=1;i--)
{
res[a[i].lo]=b[t].lo;
t=path[i][t]?t:t-1;
}
for(int i=1;i<=n;i++)
printf("%d ",res[i]);
printf("\n");
}
}
LA 4987 n个人要到m个避难所 每个避难所最少一人 求所用最短距离
最新推荐文章于 2021-03-19 00:36:53 发布