传送门

今天蒜头君拿到了一个数轴,上边有 n 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同。

蒜头君想知道,他最少需要加多少个点使这个数轴变优美。

输入格式

输入第一行为一个整数 n(1 \leq n \leq 10^5)n(1≤n≤105),表示数轴上的点数。

第二行为 nn个不重复的整数 x_1,x_2,...,x_n(-10^9 \leq x_i \leq 10^9)x1​,x2​,...,xn​(−109≤xi​≤109),表示这些点的坐标,点坐标乱序排列。

输出格式

输出一行,为一个整数,表示蒜头君最少需要加多少个点使这个数轴变优美。

样例输入复制

4
1 3 7 15

样例输出复制

1

题解:

此题考察了前缀和的变形——前缀、后缀gcd.

解题思路:

n个数,两个数之间有一段距离,则n个数之间共有n-1个距离。

首先我们将这n个数从小到大排列,求出相邻两个点的距离,这样便于求解。

如果不考虑与其他距离不同的那一对儿点的距离,让这个数轴变得优美,我们就需要加若干个点来让每个点的距离都相同,我们暂且称之为完美数轴,完美数轴若想加的点最少,则需求原来n-1个距离的最大公约数,这个最大公约数即为最终加点后的每两个点的距离。

现在我们要求有一对儿点的距离与其他距离不同的时候,最少需加多少点。有这一个条件可以利用,易知肯定比完美数轴所需点要少。因此蒜头君想要让数轴变得优美,必要情况下,肯定要让一对儿点的距离与其他距离不同的。

我们先不考虑那个与其他距离不同的那个距离,即先将那个不同的距离从n-1个距离中删去,对剩下n-2个距离求最大公约数。

则解法如下:

1、当n<=3时,则不需要考虑题中操作就满足题目要求,答案为0。

2、当n>3时,

设置gcdpre[i]:表示前i个距离求得的公共最大公约数。

设置gcdsuf[i],表示后i个距离求得的公共最大公约数。

考虑逐个删除某个距离,假设当前删除第i个距离,则剩余全部n-2个距离的最大公约数GCD=gcd(gcdpre[i-1],gcdsuf[n-i-1])。

这时,我们先假设这n-2个距离是完美数轴,就得出完美数轴所需点数为(n-2距离的总距离sum-dis[i]/GCD)+1。但是这个数轴是优美数轴,已经删除了第i个距离,怎么才能把那个不同的第i个距离加上呢?我们想象一下,把完美数轴中的一个点撕裂成两半,成为两个点,这两个点的距离就是第i个距离,这样,我们就把一个完美数轴成功地变成优美数轴了。那如何由完美数轴求优美数轴需要加多少点呢?完美数轴的点数是(sum-dis[i]/GCD)+1,优美数轴是由完美数轴将一个点撕裂成两个点得来的,因此优美数轴总点数时(sum-dis[i]/GCD)+1+1,需要加的点数就是优美数轴总点数-原数轴点数,即(sum-dis[i]/GCD)+2-n。

就这样,求出遍历删除每个点后形成优美数轴所需点数的最小值即可。

#include <iostream>
#include <algorithm>using namespace std;const int maxn=1e5+10;int a[maxn],dis[maxn],gcdpre[maxn],gcdsuf[maxn];//dis[i]为第i个距离长度
//gcdpre[i]为前i个距离的最大公约数,gcdsuf[i]为后i个距离的最大公约数
int main()
{int n;cin>>n;if(n<=3){printf("0");return 0;}for(int i=0;i<n;i++) cin>>a[i];sort(a,a+n);int sum=0;//用于求总的距离长度 for(int i=1;i<n;i++){dis[i]=a[i]-a[i-1];sum+=dis[i];}for(int i=1;i<n;i++) gcdpre[i]=__gcd(dis[i],gcdpre[i-1]);for(int i=n-1;i>=1;i--) gcdsuf[n-i]=__gcd(dis[i],gcdsuf[n-i-1]);int ans=0x3f3f3f3f;for(int i=1;i<n;i++){int temp=(sum-dis[i])/__gcd(gcdpre[i-1],gcdsuf[n-1-i]);ans=min(ans,temp-n+2);}cout<<ans;return 0;
}

此文参考博客:https://blog.csdn.net/codeswarrior/article/details/79739825?utm_source=blogxgwz4

这道题还挺不好理解的,不过挺有意思的^_^.

程序设计:蒜头君的数轴相关推荐

  1. 蒜头君的数轴:正反gcd

    题目:蒜头君的数轴 今天蒜头君拿到了一个数轴,上边有 nnn 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同. 蒜头 ...

  2. 计蒜客 蒜头君的数轴

    不考虑某个区间,其他区间必须距离相等,也就是要划分为距离为最大公约数. 那么如何快速求解任意$n-1$个区间的最大公约数?用l[i]表示前i个数的最大公约数,r[i]表示后$(n-i)$个区间的最大公 ...

  3. 61计蒜客 动态规划基础 蒜头君的城堡之旅

    题目: 蒜国地域是一个 n 行 m 列的矩阵,下标均从 1 开始.蒜国有个美丽的城堡,在坐标 (n,m) 上,蒜头君在坐标 (1,1) 的位置上.蒜头君打算出发去城堡游玩,游玩结束后返回到起点.在出发 ...

  4. 算法学习之路|蒜头君的新游戏1

    工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:nn 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃的同事可以选择将娃娃传给左边或 ...

  5. 栈和递归---手动实现一个栈和蒜头君吃桃

    栈 push--压入 pop--弹出 特点:先进后出 一.手动实现一个栈 封装数据结构--栈写成class或struct,将当前栈的数据和对当前栈的操作都放在里面 定义一个结构体Stack,规定最大存 ...

  6. 试题11 蒜头君的随机数(排序和去重)

    题目: 蒜头君想在学校里请一些同学一起做一项问卷调查,为确保实验客观性,他先用计算机生成n(i<=n<=100)个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数 ...

  7. 计蒜客--蒜头君的新游戏

    1000ms  131072K 工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:n 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃 ...

  8. 蒜头君给出若干个整数,询问其中是否有一对数的和等于给定的数。

    蒜头君给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入格式 共三行: 第一行是整数 n(0 < n \le 100,000)n(0<n≤100,000),表示有 nn 个整数. ...

  9. 蒜头君的藏书(映射)

    蒜头君有个学霸同学,家中藏书可真谓汗牛充栋.小明想考一考学霸,给学霸出了一道难题.小明问这么多书籍,到底有多少本不一样的书,每样书的名字是什么?(因为有的书名是一样的.所以我们把他们视为同样的书)学霸 ...

最新文章

  1. WPF入门教程系列九——布局之DockPanel与ViewBox(四)
  2. pgsql 运行状态 采集脚本
  3. 【转】JS回调函数--简单易懂有实例
  4. linux查询python的进程树_如何在Linux中查看所有正在运行的进程
  5. Django MEDIA_URL 路径正确仍然不显示照片
  6. Android分包方案multidex
  7. 用 Flink 取代 Spark Streaming,知乎实时数仓架构演进【推荐】
  8. HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题...
  9. 中间件是什么?在.NET Core中的工作原理又是怎样的呢?
  10. sox处理mp3_音频处理常用Linux命令总结(一)
  11. spark学习-43-Spark的BlockManager
  12. 突破性能极限,阿里云神龙最新ASPLOS论文解读
  13. 不相交轮换的乘积怎么求_浅谈两种求条件极值的方法
  14. Fedora 24 x86 安装VirtualBox
  15. 老男孩教育每日一题-第95天-shell脚本知识点:书写脚本完成ftp上传下载
  16. 字典类型及操作--易错题
  17. php 通过API接口连接12306余票查询
  18. gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file
  19. 【文献阅读】Multi-state MRAM cells for hardware neuromorphic computing
  20. 华南理工计算机电路基础试题,2017年华南理工大学计算机电路基础

热门文章

  1. border-image属性+点九图设计使用方法
  2. makefile 中.depend解析
  3. 进阶学习之Oracle基础
  4. 使用EasyDarwin+FFmpeg实现rtsp推流
  5. 贝叶斯公式的对数似然函数_最大似然估计和贝叶斯估计学习体会
  6. android anko,Announcing Anko for Android
  7. 无偏移谷歌瓦片地址_OpenLayers加载百度离线瓦片地图(完美无偏移)
  8. 部署k8s集群--1.23.1版本
  9. 输入华氏温度输出摄氏温度
  10. 在线数据处理与交易处理(EDI许可证)