题意 :

  • 给一序列,每次操作可以让一个元素减去k(k>=1),求最大的k使得若干次操作后序列中至少一半元素相等,若k为任意大,则输出-1

思路 :

  • 首先枚举任意两个数的差,那么答案k一定存在于这些差的因数中,所以枚举每组差的因数,以当前差的被减数为媒介(最终至少一半数等于这个数)判断当前k是否满足条件,取满足的最大值
  • 特别地,当原序列中有一个元素已经大于等于元素的个数的一半(n为奇数是(n+1)/2,n为偶数是n/2,但由于向下取整,可以统一为(n+1)/2),那么k为任意大,输出-1
#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#define debug(a) cout << #a << " = " << a << endl;   // 调试
#define x first
#define y second
using namespace std;
typedef long long ll;const int N = 50;int n;
int a[N];int update(int dif, int x)
{int k = 0;for (int i = 1; i * i <= dif; i ++ ){if (dif % i) continue;int cnt = 0;for (int j = 1; j <= n; j ++ )if (abs(a[j] - x) % i == 0) cnt ++ ;if (cnt >= (n + 1) / 2) k = max(k, i);cnt = 0;for (int j = 1; j <= n; j ++ )if (abs(a[j] - x) % (dif / i) == 0) cnt ++ ;if (cnt >= (n + 1) / 2) k = max(k, dif / i);}return k;
}int main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _;cin >> _;while (_ -- ){unordered_map<int, int> ma;cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i], ma[a[i]] ++ ;bool flag = false;for (auto i : ma)if (i.second >= (n + 1) / 2){flag = true;break;}if (flag){cout << -1 << endl;continue;}int k = 0;for (int i = 1; i <= n; i ++ )for (int j = i + 1; j <= n; j ++ ){int dif = abs(a[i] - a[j]);if (dif == 0) continue;      // k>=1k = max(k, update(dif, a[i]));
//                debug(dif)debug(k)        // 调试}cout << k << endl;}return 0;
}

Half of Same 思维,模拟,调试相关推荐

  1. 微信开发者工具如何模拟调试扫描小程序二维码功能

    本文主要介绍如何在微信开发者工具中模拟调试现场扫描小程序二维码功能场景. 1.添加自定义编译模式 在微信开发者工具内如下图所示,添加编译模式: 2.启动页面设置 在启动页选项中填入扫描小程序二维码后要 ...

  2. 用QEMU模拟调试裸机ARM64汇编,支持gdb单步调试

    完全是方便自己查询,做个记录. 树莓派4的SOC是ARM64, cortex A72,支持最新的ARMv8指令集,且有众多的开源资料,适合用来学习ARM64汇编,其他芯片大同小异,遇到需要,再进一步研 ...

  3. CF--思维练习--CodeForces - 216C - Hiring Staff (思维+模拟)

    ACM思维题训练集合 A new Berland businessman Vitaly is going to open a household appliances' store. All he's ...

  4. CodeForces - 820D Mister B and PR Shifts(思维+模拟)

    题目链接:点击查看 题目大意:给出一个长度为 n 的排列 p,可以执行数次循环右移的操作,问的最小值是多少 题目分析:暴力的话用 n * n 很容易实现 ,但数据是 1e6 的,显然又不能用暴力去写, ...

  5. Gym - 101972H Beautiful Substrings(思维+模拟)

    题目链接:点击查看 题目大意:题目的意思挺难理解的..尤其是对我这种英语渣来说,简单说一下,就是先给出三个数字n,m,k,然后再给出两个字符串a和b,n和m代表的是字符串a和b的长度,然后描述题意: ...

  6. 2020 ICPC亚洲区域赛(沈阳)F-Kobolds and Catacombs(思维+模拟)

    F-Kobolds and Catacombs 考虑每一段,先找到最小的,然后把编号小于它的都化为一组,此时有一个最大值需要把小于最大值的在划分进来,然后又有编号小于它的,于是再把编号小于它的划分为一 ...

  7. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)

    传送门 思路: 嗐,又是这种模拟题,每次都不长记性看数据范围,非得傻傻的去循环模拟T一次才知道思考.呜呜呜太菜了. 既然每次至少拿出m,且求的是最多次数,那我们每次就拿m出来. 先将m * p%上取整 ...

  8. 2020寒假训练第一周 思维+模拟

    这周相对来说比较简单都是基础题 同样 枯木逢春不在茂 年少且惜镜边人 直接看题吧!!!!奥利干! 1. 对于给定的一个字符串,统计其中数字字符出现的次数. Input输入数据有多行,第一行是一个整数n ...

  9. B. Most socially-distanced subsequence(思维+模拟)

    B. Most socially-distanced subsequence 题意: 给出一个数组 a a a,找到数组中的一个子序列 s s s(长为 x x x),满足" ∑ i = 1 ...

  10. 洛谷P1667/[10.22 模拟赛] 数列 (思维+模拟)

    洛谷P1667 数列 题目描述 给定一个长度是n的数列A,我们称一个数列是完美的,当且仅当对于其任意连续子序列的和都是正的.现在你有一个操作可以改变数列,选择一个区间[X,Y]满足\(A_X +A_{ ...

最新文章

  1. UI设计培训完之后可以去哪些公司工作
  2. H5解码H264实时视频流
  3. idea GsonFormat插件使用报错 StringIndexOutOfBoundsException: begin 0, end -1, length 9
  4. QT学习:读写文本文件
  5. flex 布局下关于容器内成员 flex属性的理解
  6. python 在线培训费用-python培训费需要多少钱?
  7. ArcMap制作城市道路网壁纸(OSM道路数据下载)
  8. Unity3D人体18节点骨骼动态简单点线模型的建立
  9. 如何从任意页开始设置页码
  10. 生物信息学|通过整合药物表型、治疗、化学结构和基因组特征,使用机器学习预测药物-药物相互作用
  11. 基于Proteus学习单片机系列(十一)——LCD12864
  12. BPM管理系统解决方案
  13. 主机加固,数据防泄漏的解决方案
  14. 推荐3个搜索资源的网站,保存起来,用的时候方便找哦
  15. Java短信确认机制_JAVA 消息确认机制之 ACK 模式
  16. 准备了 185 万养老金
  17. illustrator插件-常用功能开发-打开多页PDF-js脚本开发-AI插件
  18. RCS(Real-time control systems) 库
  19. edge无法登录账户_系统天地教你解决win10 microsoft edge浏览器无法开的问题
  20. 走近阿里Apsara Clouder云计算的蓝图

热门文章

  1. ABAP中查找代码的标准程序
  2. SAP ERP系统业务优化之采购订单追踪
  3. 【转】SAP地产业正青春
  4. SAP ITS mobile 简介
  5. 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈
  6. 如何配note,打补丁
  7. abap 字符串处理
  8. 中小SAP项目中的人员编制
  9. java中有哪几种注释方式_在 Java 中, 有多种注释方法,其中 __________ 适用于单行注释。...
  10. java isodate格式_fmt:formatDate的输出格式详解