C. Sequence Master
挺有意思的一道题
题意:给定一个长度的数组,要求构造一个长度也为的整数数组,使得满足从中任选个数字的积等于中剩下个数的和,求出与的最短距离
最短距离定义为对应元素差的绝对值之和
由于的要求有点严苛,先考虑如何构造(条件严格的话的数量可能很小,因此后面算最小距离时可能可以暴力枚举)
分为两种情况考虑:
有
因为其强对称性考虑全部元素都相等,此时有
·得到一组通解
·以及当时,可以为任意值
·当时,
当不全相等时,不妨设有
此时有方程组:
两式相减得:
即:
由于,所以
因为的限制是任意个数,所以其实这些数中任意取个的乘积都为
又因为为整数,所以只有当时,才有解:
代回方程得:
即:
又有:
即:
解得 ,无论顺序
综上,由于只有三种情况,暴力讨论距离最小值即可
点击查看代码
#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
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】