蓝桥杯十题解答 + 蓝桥杯:等差数列(gcd--最大公约数问题)

蓝桥杯十题解答

1.成绩统计
2.后缀表达式
3.数列求值
4.等差数列
5.特别数的和
6.最优包含
7.最大降雨量+8.质数
9.旋转
10.人物相关性分析

蓝桥杯:等差数列

在这里插入图片描述

题解:

此题为明显的gcd(最大公约数)问题。
首先明白我们想要组成的等差数列最短,那么在我们对给定的几个整数排好序后,最大和最小的的一定是边界项。
既然边界已经固定,我们只需要确定公差即可。
又因为想要数列长度尽可能的短,因此我们尽量去选择最大的公差。
而公差与什么有关呢?
我们可以得知其与每两个数之间的间隔有关,即最大公差即为每两个数之间的间隔的gcd
在求最大公约数时我们可以先找定其理想上的最大公约数,即几个整数中最小的那个。(因为公约数不能大于数本身)
然后看其是否满足要求,即是否能被整除,不满足则减小直到找到即可。

代码:

#include<bits/stdc++.h>
#include<stdlib.h>
using namespace std;
int a[100000];
int cmp(const void*x,const void*y)
{
	int a = *(int*)x;
	int b = *(int*)y;
	return a>b?1:-1;
} 
int main() 
{ 
	int n;
	int d;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	qsort(a,n,sizeof(int),cmp);
	int*b = (int*)malloc(sizeof(int)*n);
	memset(b,INT_MAX,sizeof(b));
	for(int i=1;i<n;i++)
	{
		b[i-1] = a[i]-a[i-1];
	}
	qsort(b,n-1,sizeof(int),cmp);
	for(int j=b[0];;j--)
	{
		int flag = 0;
		for(int k=0;k<n-1;k++)
		{
			if(b[k]%j==0)
			{
				flag++;
			}
		}
		if(flag==n-1)
		{
			d = j;
			break;
		}
	}
	int length = (a[n-1]-a[0])/d+1;
	printf("%d",length);
	
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值