题目链接
题意
大概就是两排电脑,同一排的电脑是彼此联通的,不同排的电脑则不是,现在要求是让所有电脑连接在一起,而把a行第i个电脑与b中第j个电脑连接在一起的花费是 |a[i]-b[j] | ,要求是寻找把所有电脑连在一起的最小花费
思路
这题给我的感觉大概是一个模拟题,因为同一行的电脑是连接好了的,问题是怎么样把两行的电脑彼此连接在一起,主要是要考虑的是a[1] a[n] b[1] b[n] 之间的连接情况。
画张图列举一下。。(啊对不起有点潦草((
那么我们现在需要列举出每一种情况的值,找出最小的那个就好。
代码
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Endl "\n"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+5;
const int INF = 0x3f3f3f;
const int mod = 1e9 + 7;
const double pi = acos(-1);
inline ll read(){
ll x = 0, f = 1; char ch; ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll n;
int a[maxn],b[maxn];
int get(int a[],int l,int r, int p)
{
int minx=1e9;
for(int i=l;i<=r;i++)
minx=min(minx,abs(p-a[i]));
return minx;
}
void solve() {
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
ll l1=get(b,2,n,a[1]),r1=get(b,1,n-1,a[n]);
ll l2=get(a,2,n,b[1]),r2=get(a,1,n-1,b[n]);
ll s1=l1+l2+r1+r2,s2=abs(a[1]-b[1])+r1+r2,s3=l1+l2+abs(a[n]-b[n]);
ll spj=min(abs(a[1]-b[n])+abs(a[n]-b[1]),abs(a[1]-b[1])+abs(a[n]-b[n]));
spj=min(spj,l1+r2+abs(a[n]-b[1]));
spj=min(spj,l2+r1+abs(a[1]-b[n]));
cout<<min(spj,min(s1,min(s2,s3)))<<endl;
return ;
}
int main() {
for(int T = read(); T; T--)
solve();
return 0;
}