gcd前缀和-蒜头君的数轴
题目:
今天蒜头君拿到了一个数轴,上边有 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前缀和-蒜头君的数轴的更多相关文章
- 计蒜客 - A1633.蒜头君的数轴
我感觉出的很好的一道题,首先不难想到(其实我刚开始没想到),加点的个数就是找已有点两两形成区间的gcd,那么问题就出在了复杂度上,每次循环哪个区间不要复杂度过高,所以运用正反两次前缀和(?好像不能这么 ...
- 计蒜客模拟赛D2T3 蒜头君救人:用bfs转移状压dp
题目链接:https://nanti.jisuanke.com/t/16444 题意: 蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境 ...
- 计蒜客模拟赛D1T3 蒜头君的坐骑:用dfs转移dp
题目链接:https://nanti.jisuanke.com/t/16447 题意: 蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片n*m的大荒野,一开始时,蒜头君在(1,1)点,他要 ...
- 计蒜客D2T2 蒜头君的排序(动态维护树状数组)
蒜头君的排序(sort) 2000ms 262144K 蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺 ...
- 蒜头君学英语--set()练习
题目描述 蒜头君快要考托福了,这几天,蒜头君每天早上都起来记英语单词.花椰妹时不时地来考一考蒜头君:花椰妹会询问蒜头君一个单词,如果蒜头君背过这个单词,蒜头君会告诉花椰妹这个单词的意思,不然蒜头君会跟 ...
- HDU - 6025 Coprime Sequence(gcd+前缀后缀)
Do you know what is called ``Coprime Sequence''? That is a sequence consists of nnpositive integers, ...
- 计蒜客习题:蒜头君的积木 (状压DP 枚举子集)
问题描述 蒜头君酷爱搭积木,他用积木搭了 n 辆重量为 wi的小车和一艘最大载重量为 W 的小船,他想用这艘小船将 n 辆小车运输过河.每次小船运载的小车重量不能超过 W.另外,小船在运载小车时,每辆 ...
- 计蒜客 蒜头君回家(有条件的BFS)
蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方.” 蒜头君希望能尽快回到家中,他需要首先取得任意 ...
- B 蒜头君的树
时间限制 : - MS 空间限制 : - KB 评测说明 : 2s,256m 问题描述 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少. 另外,由于各种原因,蒜 ...
随机推荐
- GIT-windows系统部署gitblit服务器
windows系统部署 gitblit 服务器 1. 安装JAVA环境 下载Java,下载地址:http://www.java.com/zh_CN/ 安装Java.安装步骤不再详述. 配置J ...
- IDEA+Maven配置MyBatis的初体验(坑点总结)
起因 在老师的推荐下,我跟着这篇文章https://www.jb51.net/article/70923.htm尝试MyBatis的初次调试运行.途中困难重重,由于教程中的开发环境是eclipse,项 ...
- 微信小程序button组件样式
点击微信按键组件才能出授权,所以自定义样式就是必须的了,来自网友的帮助,如下图 <button class='btn1' open-type='contact'> <image cl ...
- Python的一些高级特性以及反序列化漏洞
0x01 简述 文章主要记录一下python高级特性以及安全相关的问题 python作为脚本语言,其作为高级语言是由c语言开发的,关于python的编译和链接可以看向这里https://github. ...
- MYSQL的学习
启动MYSQL :net start mysql或者手动启动,输入密码:mysql -u root -p 先创建数据库在创建表格,创建数据库:create databsse 数据库名称,创建表格:cr ...
- Contest2162 - 2019-3-28 高一noip基础知识点 测试5 题解版
传送门 T1 单调栈 按照b排序 在家每一个物品时,判断一下a和b的关系 如果s[sta[top]].a>=s[i].b,就弹栈 记录所有时候的height,并取最大值 T2 单调栈裸题 单调栈 ...
- httpClient closeableHttpClient
https://www.cnblogs.com/lyy-2016/p/6388663.html
- windows下搭建Kafka,并通过命令窗口收发消息
参考网址: https://blog.csdn.net/ydc321/article/details/70154278 前提条件:windows环境需要安装jdk 1.下载Kafka,可以通过官网下载 ...
- [经验交流] 影响 kubernetes 稳定性的因素
使用k8s已有近一年的时间,版本从1.2到1.5.1.6.1.7,期间出现并解决了不少问题,下面是我总结的影响k8s集群稳定性的因素: 1. 安装环境 *kubelet版本最好与kube-apiser ...
- spring cloud--zuul网关和zuul请求过滤
这里仍然以Windows和jdk为运行环境,按照下面的步骤打包-运行-访问就能看到效果.启动项目jar包: java -jar F:\jars-zuul\register-0.0.1-SNAPSHOT ...