题目大意:

给定一个包含 \(n\)(\(n\) 是偶数)个整数的数列 \(a_1,a_2,\ldots,a_n\)。

考虑一个可能的正整数 \(k\),在每次操作中,你可以选定一个 \(i\),并将 \(a_i\) 减少 \(k\)。

你可以执行任意多次(也可能是零次)操作,使这个数列中至少一半的数相等。

请找出最大的符合条件的 \(k\),如果 \(k\) 可以是任意的大小,输出 \(-1\)。

观察题目,不难发现,满足输出 \(-1\) 的充要条件就是原数列里已经至少有一半的数相等了,因此输入后我们判断一下这种情况是否存在即可。

题目中的操作,实际上就等价于让我们寻找一个最大的 \(k\),使得数列中至少有一半的数关于它同余即可。我们在数列中选出 \(a\) 和 \(b\),使得如下式子成立:

\[a\equiv b(\mod k)
\]

以此推出,得:

\[k\mid (a-b)
\]

这就说明,我们只需要枚举数列中任意两个数,将他们相减后得到的数设为 \(d\),枚举 \(d\) 的因数,寻找一个最大的因数使得数列中有至少一半的数关于它同余即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10000000;
int n,a[MAXN];
int t;
map<int,int> m;
int gcd(int a,int b){
if(!b){
return a;
}
return gcd(b,a % b);
}
int main(){
cin >> t;
while(t--){
m.clear();
cin >> n;
n /= 2;
for(int i = 1; i <= 2 * n; i++){
cin >> a[i];
m[a[i]]++;
}
bool flagb = 0;
for(int i = 1; i <= 2 * n; i++){
if(m[a[i]] >= n){
cout << "-1\n";
flagb = 1;
break;
}
}
if(flagb)continue;
bool flag;
int ans = 0;
for(int l = 1; l <= 2 * n; l++){
//cout << 1 << "\n";
for(int r = l + 1; r <= 2 * n; r++){
for(int j = (int)(sqrt(abs(a[l] - a[r]))) + 1; j >= 1; j--){
if(abs(a[l] - a[r]) % j == 0 && abs(a[l] - a[r]) != 0){
flag = 1;
int cnt = 0;
for(int i = 1; i <= 2 * n; i++){
if((a[i] + MAXN) % j == (a[l] + MAXN) % j)cnt++;
if(cnt == n){
ans = max(ans,j);
break;
}
}
cnt = 0;
int h = abs(a[l] - a[r]) / j;
for(int i = 1; i <= 2 * n; i++){
if((a[i] + MAXN) % h == (a[l] + MAXN) % h)cnt++;
if(cnt == n){
ans = max(ans,h);
break;
}
}
} }
}
}
cout << ans << "\n";
} return 0;
}

CF1593D2 Half of Same的更多相关文章

随机推荐

  1. Linux 常见必备

    一.学习Linux须知常识 1.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比 ...

  2. 不要使用Java Executors 提供的默认线程池

    线程池构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUni ...

  3. JS运算符,流程控制,函数,内置对象,BOM与DOM

    运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...

  4. nginx1.1 nginx介绍和反向代理

    1.什么是nginx nginx是一个高性能的http和反向代理的web服务器,所占内存小,高并发 nginx默认端口:80端口 命令存放目录:cd /usr/local/nginx/sbin 配置文 ...

  5. 三、单redis升级redis集群+哨兵

    针对假如已经是安装了redis,只是是单部署,需要把他切换成redis集群+哨兵模式,我因为偷懒,就写了个脚本来执行,各位看官,请品~你品~你细品~ 首先准备个升级包,放到任意路径,内容如下: 第一个 ...

  6. 167. Two Sum II - Input array is sorted - LeetCode

    Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...

  7. 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等

    温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...

  8. Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景

    在上周三下午时,客户.业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的 ...

  9. C#获取PLC信息 (KepServer)

    首先注册DLL 我这里把此DLL放到我自己的网站上了,供大家下载 https://blog.nwctwang.top/OPCDAAuto.dll 把此dll复制到C:\Windows\SysWOW64 ...

  10. 用OpenMV自动识别颜色序列

    目录 用OpenMV自动识别颜色序列 用OpenMV自动识别颜色序列 新年假期过去啦~ 主控:OpenMV3 M7摄像头(STM32F765) IDE:OPENMV官方IDE 我将Capstone期间 ...