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+10; 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==0)return a;elsereturn gcd(b,a%b); } int main() {int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&arr[i]);}if(n<=3){printf("0\n");}else{sort(arr,arr+n);long long sum=0;for(int i=1;i<n;i++){dist[i]=arr[i]-arr[i-1];sum+=dist[i];}int d=dist[0];for(int i=1;i<n;i++){d=gcd(d,dist[i]);gcd1[i]=d;}d=dist[n-1];for(int i=1;i<n;i++){d=gcd(d,dist[n-i]);gcd2[i]=d;}int Min=0x3f3f3f3f,temp;for(int i=1;i<n;i++){if(i==1){temp=(sum-dist[i])/gcd2[n-2];}else if(i==n-1){temp=(sum-dist[i])/gcd1[n-2];}else{temp=(sum-dist[i])/gcd(gcd1[i-1],gcd2[n-i-1]);}Min=min(Min,temp-(n-2));}printf("%d\n",Min);}return 0; }
转载于:https://www.cnblogs.com/LJHAHA/p/10650218.html
gcd前缀和-蒜头君的数轴相关推荐
- 蒜头君的数轴:正反gcd
题目:蒜头君的数轴 今天蒜头君拿到了一个数轴,上边有 nnn 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同. 蒜头 ...
- 程序设计:蒜头君的数轴
传送门 今天蒜头君拿到了一个数轴,上边有 n 个点,但是蒜头君嫌这根数轴不够优美,想要通过加一些点让它变优美,所谓优美是指考虑相邻两个点的距离,最多只有一对点的距离与其它的不同. 蒜头君想知道,他最少 ...
- 计蒜客 蒜头君的数轴
不考虑某个区间,其他区间必须距离相等,也就是要划分为距离为最大公约数. 那么如何快速求解任意$n-1$个区间的最大公约数?用l[i]表示前i个数的最大公约数,r[i]表示后$(n-i)$个区间的最大公 ...
- [Java] 计蒜客---蒜头君的玩具
一.内容 二.思路 用差分数组算出每个点总共被包含了几次,比如1-4就等于1-4区间的数组都加上1.这样a数组最终保存的就是装了这个点总共被覆盖几次. 由于每次只能选3条线段,所以数组里面每个点的值必 ...
- 61计蒜客 动态规划基础 蒜头君的城堡之旅
题目: 蒜国地域是一个 n 行 m 列的矩阵,下标均从 1 开始.蒜国有个美丽的城堡,在坐标 (n,m) 上,蒜头君在坐标 (1,1) 的位置上.蒜头君打算出发去城堡游玩,游玩结束后返回到起点.在出发 ...
- 算法学习之路|蒜头君的新游戏1
工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:nn 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃的同事可以选择将娃娃传给左边或 ...
- 栈和递归---手动实现一个栈和蒜头君吃桃
栈 push--压入 pop--弹出 特点:先进后出 一.手动实现一个栈 封装数据结构--栈写成class或struct,将当前栈的数据和对当前栈的操作都放在里面 定义一个结构体Stack,规定最大存 ...
- 试题11 蒜头君的随机数(排序和去重)
题目: 蒜头君想在学校里请一些同学一起做一项问卷调查,为确保实验客观性,他先用计算机生成n(i<=n<=100)个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数 ...
- 计蒜客--蒜头君的新游戏
1000ms 131072K 工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:n 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃 ...
- 蒜头君给出若干个整数,询问其中是否有一对数的和等于给定的数。
蒜头君给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入格式 共三行: 第一行是整数 n(0 < n \le 100,000)n(0<n≤100,000),表示有 nn 个整数. ...
最新文章
- a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础
- php修改http header,php header函数的常用http头设置
- Java键盘交互设计输入法,输入法中暖心的交互细节
- tesseract-ocr tips
- 听一听蚂蚁金服机器学习算法中台周俊谈共享智能技术实践:如何降低数据共享的难度?
- CTF刷题网站汇总(包括本地可以自己搭建的)(1)
- 基于centos5.8源码安装nginx之LNMP
- 剖析ASSERT函数
- IDEA 错误:找不到或无法加载主类
- 优盘提示插入多卷集的最后一卷解决办法(5)
- PowerDesigner如何设计表之间的关联
- Oracle修改globalname,oracle修改global_name和service_name
- python之Beautiflusoup操作
- 第十八次ScrumMeeting博客
- 广州科源980tc数控系统说明书_广州数控GSK980TC3车床数控系统 操作轴名
- linux socket函数详解,linuxSocket_函数.doc
- SA与OOA的区别,个人理解
- Hexo Next主题中集成gitalk评论系统
- php中asp标签怎么打开新页面,A标签新窗口打开怎么设置
- 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例