C. Sequence Master

题目链接

挺有意思的一道题

题意:给定一个2n长度的数组p,要求构造一个长度也为2n的整数数组q,使得q满足从q中任选n个数字的积等于q中剩下n个数的和,求出pq的最短距离

最短距离定义为对应元素差的绝对值之和

由于q的要求有点严苛,先考虑如何构造q(条件严格的话q的数量可能很小,因此后面算最小距离时可能可以暴力枚举)

分为两种情况考虑:

i,jqi==qj

因为其强对称性考虑全部元素都相等,此时有qin==nqi

·得到一组通解qi=0

·以及当n==1时,qi可以为任意值

·当n==2时,qi==2

qi不全相等时,不妨设有q1!=q2

此时有方程组:

{q1q3q4qn+1=q2+qn+2++q2nq2q3q4qn+1=q1+qn+2++q2n

两式相减得: (q1q2)q3q4qn+1=q2q1

即: (q1q2)(q3q4qn+1+1)=0

由于q1!=q2,所以q3q4qn+1=1

因为q的限制是任意n个数,所以其实q3,,2n这些数中任意取n1个的乘积都为1

又因为qi为整数,所以只有当2|n时,才有解:q3=q4==q2n=1

代回方程得:q1(1)=q2n+1

即:q1+q2=n1

又有:q1q2qn=qn+1++q2n

即:q1q2=n

解得 q1=n,q2=1,无论顺序

综上,由于只有三种情况,暴力讨论距离最小值即可

点击查看代码
#include<bits/stdc++.h>
#include<vector>
#include<map>
#include<queue>
#define int long long
#define inf 1e18
#define inc 0xcfcfcfcf
#define N 300007
#define M 500007
#define mod 1000000007
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
inline int Read()
{
	char ch=getchar();bool f=0;int x=0;
	for(;!isdigit(ch);ch=getchar())if(ch=='-')f=1;
	for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	if(f==1)x=-x;return x;
}
int T=1,n,m;
bool Solve()
{
 	//freopen("test.in","r",stdin);
	n=Read();
	vector<int> a;
	for(int i=1;i<=2*n;++i)
	{
		int in=Read();
		a.emplace_back(in);
	}
	if(n==1)
	{
		printf("%lld\n",abs(a[1]-a[0]));
		return 1;
	}
	sort(a.begin(),a.end());
	int s1=0,s2=0,s3=0;
	for(int i=0;i<a.size();++i)
	{
		s1+=abs(a[i]);
		s2+=abs(a[i]-2);
		if(i+1!=a.size())
			s3+=abs(a[i]+1);
	}
	s3+=abs(a[a.size()-1]-n);
	if(n==2)
	{
		printf("%lld\n",min(s1,min(s2,s3)));
		return 1;
	}
	if(n%2==0)
		printf("%lld\n",min(s1,s3));
	else
		printf("%lld\n",s1);
	return true;
}
signed main()
{
	T=Read();
	while(T--)
		if(!Solve())
			printf("-1\n");
	return 0;
}
/*
-std=c++11
-std=c99
*/


posted @   模拟退火  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示