求助,改不对
  • 板块学术版
  • 楼主bctj
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/17 16:10
  • 上次更新2023/11/3 03:07:40
查看原帖
求助,改不对
663745
bctj楼主2023/8/17 16:10

题目描述 有2*n名学生在上体育课,他们排成了互相平行的人数相等且一一对应的两排(第一排第一位对应第二排第一位,第一排第二位对应第二排第二位,以此类推), 体育老师想要学生快速调整位置,使得位置相邻的学生们的身高差之和最小。为了维持班级秩序,老师在调整站位时仅将两排中对应位置的两人进行站位对调(比如当需要调整第一排第一位同学的站位时,只能将他与第二排第一位同学进行站位对调,不能与任何其他同学进行站位对调)。现在我们知道第一排的学生身高为a1,a2,a3...an,第二排学生的身高为b1,b2,b3...bn。我们要通过任意次交换位置使得|a2-a1|+|a3-a2|+...+|an-an-1|+|b2-b1|+|b3-b2|+|bn-bn-1|最小。聪明的同学你知道经过体育老师调整后相邻学生们的身高差之和最小是多少吗?
输入
第一行输入n,表示第一排和第二排各有n名学生。第二行有n个数,ai表示第i位同学身高为ai,第二行也有n个数,bi表示第i位同学身高为bi(
输出
输出一行,表示答案。\

样例输入 Copy
5
1 2 3 4 5
6 7 8 9 10
样例输出 Copy
8\

#include <iostream>
#include <cmath>
using namespace std;
const int q=1e5;
long long n,a[q],b[q],sum;
long long qwq()
{
	long long ans=0;
	for(long long i=2;i<=n;i++)
	{
		ans+=abs(a[i]-a[i-1]);
	}
	for(long long i=2;i<=n;i++)
	{
		ans+=abs(b[i]-b[i-1]);
	}
	return ans;
}
int  main()
{
	scanf("%lld",&n);
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&b[i]);
	}
	a[0]=a[1];
	b[0]=b[1];
	for(long long i=1;i<=n;i++)
	{
		if(i==1)
		{
			long long aa=(abs(a[i+1]-a[i]))+(abs(b[i+1]-b[i]));
			long long bb=(abs(a[i+1]-b[i]))+(abs(b[i+1]-a[i]));
			printf("%d %d %d\n",i,aa,bb);
			if(bb<aa)
			{
				swap(a[i],b[i]);
			}
			continue; 
		}
		long long aa=(abs(abs(a[i+1]-a[i])-a[i-1]))+(abs(abs(b[i+1]-b[i])-b[i-1]));
		long long bb=(abs(abs(a[i+1]-b[i])-a[i-1]))+(abs(abs(b[i+1]-a[i])-b[i-1]));
		printf("%d %d %d\n",i,aa,bb);
		if(bb<aa)
		{
			swap(a[i],b[i]);
		}
	}
		printf("\n");
	for(int i=1;i<=n;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	for(int i=1;i<=n;i++)
	{
		printf("%d ",b[i]);
	}
	sum=qwq();
	printf("%lld",sum);
    return 0;
}
2023/8/17 16:10
加载中...