题目:

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

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

输入格式

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

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

输出格式

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

主要思路是求:最大公约数。

由题意可以知道,数轴是否优美与相邻两个点的距离有关,假设我们暂时不考虑最多只有一对点的距离与其他的不同,那么最终我们加完点之后的间隙大小便等于此时所有间隔的 gcd,于是我们可以求出间隔 gcd,然后此时相邻两个点之间所要添加的点的个数便可以直接计算得到了。

n个数,互不相同,则求相邻两点距离,共有n-1个距离。题目允许最多有一对点距离与其他不同,因此对于n-1个距离,我们都要考虑到,因此要对n-1个距离逐个删去,对剩余n-2个距离求共同的最大公约数。为了求得这个最大公约数。则解法如下:

1.如果n<=3,则不需要考虑题中操作就满足题目要求,答案为0.

2.除情况1外的其他情况。

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

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

则考虑逐个删除某个距离,假设当前删除第i个距离。

若i = 1,即删除第一个距离,则需要后n-2个距离的最大公约数,即gcd2[n-2].

若i = n-1,即删除最后一个距离,则需要前n-2个距离的最大公约数,即gcd1[n-2].

若i > 1 && i < n-1,则需要前i-1个距离的最大公约数和后n-1-i个距离的最大公约数 和在一起求出最大公约数。即gcd(gcd1[i-1],gcd2[n-i-1]).

转载自博客:https://blog.csdn.net/HTallperson/article/details/79769181

代码:

#include<cstdio>
#include<iostream> #include <algorithm> using namespace std;
const int maxn = 1e5+;
int gcd1[maxn]; //gcd1[i]是前i个距离的gcd
int gcd2[maxn]; //gcd2[i]是后i个距离的gcd
int arr[maxn];
long long dist[maxn];
int gcd(int a,int b)
{
if(b==)
return a;
else
return gcd(b,a%b);
}
int main()
{
int n;scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&arr[i]);
}
if(n<=){
printf("0\n");
}
else{
sort(arr,arr+n);
long long sum=;
for(int i=;i<n;i++){
dist[i]=arr[i]-arr[i-];
sum+=dist[i];
}
int d=dist[];
for(int i=;i<n;i++){
d=gcd(d,dist[i]);
gcd1[i]=d;
}
d=dist[n-];
for(int i=;i<n;i++){
d=gcd(d,dist[n-i]);
gcd2[i]=d;
}
int Min=0x3f3f3f3f,temp;
for(int i=;i<n;i++){
if(i==){
temp=(sum-dist[i])/gcd2[n-];
}else if(i==n-){
temp=(sum-dist[i])/gcd1[n-];
}else{
temp=(sum-dist[i])/gcd(gcd1[i-],gcd2[n-i-]);
}
Min=min(Min,temp-(n-));
}
printf("%d\n",Min);
}
return ;
}

gcd前缀和-蒜头君的数轴的更多相关文章

  1. 计蒜客 - A1633.蒜头君的数轴

    我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...

  2. 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp

    题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...

  3. 计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp

    题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要 ...

  4. 计蒜客D2T2 蒜头君的排序(动态维护树状数组)

    蒜头君的排序(sort) 2000ms 262144K 蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺 ...

  5. 蒜头君学英语--set()练习

    题目描述 蒜头君快要考托福了,这几天,蒜头君每天早上都起来记英语单词.花椰妹时不时地来考一考蒜头君:花椰妹会询问蒜头君一个单词,如果蒜头君背过这个单词,蒜头君会告诉花椰妹这个单词的意思,不然蒜头君会跟 ...

  6. HDU - 6025 Coprime Sequence(gcd+前缀后缀)

    Do you know what is called ``Coprime Sequence''? That is a sequence consists of nnpositive integers, ...

  7. 计蒜客习题:蒜头君的积木 (状压DP 枚举子集)

    问题描述 蒜头君酷爱搭积木,他用积木搭了 n 辆重量为 wi的小车和一艘最大载重量为 W 的小船,他想用这艘小船将 n 辆小车运输过河.每次小船运载的小车重量不能超过 W.另外,小船在运载小车时,每辆 ...

  8. 计蒜客 蒜头君回家(有条件的BFS)

    蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方.” 蒜头君希望能尽快回到家中,他需要首先取得任意 ...

  9. B 蒜头君的树

    时间限制 : - MS   空间限制 : - KB  评测说明 : 2s,256m 问题描述 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少. 另外,由于各种原因,蒜 ...

随机推荐

  1. Exp5 MSF基础应用

    一.实践内容 1.主动攻击实践 [1]MS08-067 MS08-067 漏洞是2008 年年底爆出的一个特大漏洞,存在于当时的所有微软系统,杀伤力超强.其原理是攻击者利用受害主机默认开放的SMB 服 ...

  2. Ubuntu16.04安装及配置nginx

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  3. Sql查询某个字段是否包含小写字母

    SELECT * from student where username COLLATE Chinese_PRC_CS_AS LIKE '%[abcdefghijklmnopqrstuvwxyz]%'

  4. PMP知识点(三)——挣值计算汇总表

    在新标签页打开. 附参考图 资料地址:http://pan.baidu.com/s/1bMNroq

  5. 通过<meta>标签指定IE的文档模式实现CSS3兼容

    今天发现之前做好的一个页面在IE中打开显示的效果不正常,本地和服务器上显示的是两种不同的样式. 经过确认文档内容和CSS都是一样的. 通过IE F12(开发人员工具)发现不正常的样式 浏览器文档模式自 ...

  6. EF提交插入数据catch捕获具体异常方法

    try { db.SaveChanges(); } catch (DbEntityValidationException ex) { StringBuilder errors = new String ...

  7. Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  8. input下拉带输入框

    html5 自带的datalist实现 html代码: <input list="students"> <datalist id="students&q ...

  9. C# 解析torrent文件

    基础知识: torrent文件信息存储格式: bencoding是一种以简洁格式指定和组织数据的方法.支持下列类型:字节串.整数.列表和字典. 1 字符串存储格式:  <字符串的长度>:& ...

  10. 2018-2019-2 20175306实验二面向对象程序设计《Java开发环境的熟悉》实验报告

    2018-2019-2 20175306实验二面向对象程序设计<Java开发环境的熟悉>实验报告 面向对象程序设计-1 实验要求: 参考:> http://www.cnblogs.c ...