CF1661A Array Balancing

Link\text{Link}

题意

给出两个 nn 个数的数组 a1n,b1na_{1\sim n},b_{1\sim n},你可以交换任意的 aia_ibi(1in)b_i(1\le i\le n),求 i=1n(aiai+1+bibi+1)\sum_{i=1}^n(|a_i-a_{i+1}|+|b_i-b_{i+1}|) 的最小值。

分析

分别考虑每一个 aiai+1+bibi+1(1i<n)|a_i-a_{i+1}|+|b_i-b_{i+1}|(1\le i<n),可以发现不管 ai,bia_i,b_i 的值如何改变,ai+1,bi+1a_{i+1},b_{i+1} 都能通过交换位置或不换位置达到可能的两种取值 aiai+1+bibi+1|a_i-a_{i+1}|+|b_i-b_{i+1}|aibi+1+biai+1|a_i-b_{i+1}|+|b_i-a_{i+1}|,所以对两种情况取最小值再求和即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=30;
int t,n;
ll sum,a[N],b[N];
int main(){
	t=read();
	while(t--){
		n=read();
		sum=0;
		for(int i=1;i<=n;i++)
			a[i]=read();
		for(int i=1;i<=n;i++)
			b[i]=read();
		for(int i=1;i<n;i++)
			sum+=min(abs(a[i]-a[i+1])+abs(b[i]-b[i+1]),abs(a[i]-b[i+1])+abs(b[i]-a[i+1]));
		write(sum);
		puts("");
	}
	return 0;
}
posted @ 2022-04-11 21:28  luckydrawbox  阅读(9)  评论(0)    收藏  举报  来源