CF1593D2 Half of Same
题目大意:
给定一个包含 \(n\)(\(n\) 是偶数)个整数的数列 \(a_1,a_2,\ldots,a_n\)。
考虑一个可能的正整数 \(k\),在每次操作中,你可以选定一个 \(i\),并将 \(a_i\) 减少 \(k\)。
你可以执行任意多次(也可能是零次)操作,使这个数列中至少一半的数相等。
请找出最大的符合条件的 \(k\),如果 \(k\) 可以是任意的大小,输出 \(-1\)。
观察题目,不难发现,满足输出 \(-1\) 的充要条件就是原数列里已经至少有一半的数相等了,因此输入后我们判断一下这种情况是否存在即可。
题目中的操作,实际上就等价于让我们寻找一个最大的 \(k\),使得数列中至少有一半的数关于它同余即可。我们在数列中选出 \(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的更多相关文章
随机推荐
- Linux 常见必备
一.学习Linux须知常识 1.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应用程序,比 ...
- 不要使用Java Executors 提供的默认线程池
线程池构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUni ...
- JS运算符,流程控制,函数,内置对象,BOM与DOM
运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...
- nginx1.1 nginx介绍和反向代理
1.什么是nginx nginx是一个高性能的http和反向代理的web服务器,所占内存小,高并发 nginx默认端口:80端口 命令存放目录:cd /usr/local/nginx/sbin 配置文 ...
- 三、单redis升级redis集群+哨兵
针对假如已经是安装了redis,只是是单部署,需要把他切换成redis集群+哨兵模式,我因为偷懒,就写了个脚本来执行,各位看官,请品~你品~你细品~ 首先准备个升级包,放到任意路径,内容如下: 第一个 ...
- 167. Two Sum II - Input array is sorted - LeetCode
Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...
- 学习Linux须知1.0之Linux相关概念、工具(yum、vim)、防火墙等
温馨提示:重点掌握的前面都标注了 ☆ 一.Linux 是什么? Linux 是一个操作系统. 我们的 Linux 主要是系统调用和内核那两层. 当然直观地看,我们使用的操作系统还包含一些在其上运行的应 ...
- Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景
在上周三下午时,客户.业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的 ...
- C#获取PLC信息 (KepServer)
首先注册DLL 我这里把此DLL放到我自己的网站上了,供大家下载 https://blog.nwctwang.top/OPCDAAuto.dll 把此dll复制到C:\Windows\SysWOW64 ...
- 用OpenMV自动识别颜色序列
目录 用OpenMV自动识别颜色序列 用OpenMV自动识别颜色序列 新年假期过去啦~ 主控:OpenMV3 M7摄像头(STM32F765) IDE:OPENMV官方IDE 我将Capstone期间 ...