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 问题描述 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少. 另外,由于各种原因,蒜 ...
随机推荐
- woe_iv原理和python代码建模
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- 半导体制造、Fab以及Silicon Processing的基本知识
本文转载自微信公众号 - 手机技术资讯 , 链接 https://mp.weixin.qq.com/s/602xLKXcIw4ccTnhvDP1xw
- Python——LOL官方商城皮肤信息爬取(一次练手)
# -*- coding utf-8 -*- import urllib import urllib.request import json import time import xlsxwriter ...
- 域 搭建OU 组织单元
以这个界面开始操作: 在 baidu.com 右键---新建----组织单位----北京分公司 在 baidu.com 右键---新建----组织单位----北京分公司 在北京分公司 和南京分公司下面 ...
- fhq treap
学了一下,好像明白了(背下来了) 不想写main函数了 PS:这个比treap好写(私以为) #include<bits/stdc++.h> using namespace std; in ...
- vue组件中data为什么必须是个函数
<body> <div id="app"> <counter></counter> </div> <templat ...
- eclipse出现jdk版本更新导致无法启动
启动出现的问题,截图: 解决办法: 1.找到自己jdk安装的bin目录,我的安装目录是:F:\jdk\bin 2.修改eclipse安装目录下的eclipse.ini,添加 -vmF:\jdk\bin ...
- JDK开发环境配置
1. 新建 -> 变量名“JAVA_HOME”, 变量值“C:\Program Files\Java\jdk1.8.0_112”(即JDK的安装路径) 2. 编辑 -> 变量名“Path” ...
- 关于lnmp下 phalcon和tp框架下的nginx文件配置
vim /etc/nginx/sites-available/default 进入修改目录 1.正常项目配置 server { listen 80 default_server; listen [ ...
- win10只有edge浏览器能上网的解决方法
问题描述:电脑就只有edge浏览器和自带的邮件可以上网,但是QQ Chrome,360浏览器都无法上网: 解决方法:打开命令提示符(管理员),执行netsh winsock reset,重启系统就好了 ...