0
点赞
收藏
分享

微信扫一扫

【蓝桥——2019省赛————等差数列】你是不是一直运行错误(kuai)(lai)(ba)

RJ_Hwang 2022-01-24 阅读 44

今天看了一下,这个题目的AC率,我发现是有史以来最最低的。

这道题究竟难在哪里?这道题又有什么难以引言的秘密?到底是道德的沦丧,还是人性的缺失————现在,就一起来看看。

看题目

先讲一下可能大家运行不了的基本做法



你的代码是不是长这样(不懂sort的看我上一个帖子😜

#include<bits/stdc++.h>
using namespace std;
int a[100000],b[100000];
int main()
{
    int n,i,m=100000000,f=0;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);    //我上一个帖子有关于sort的详细用法
    for(i=1;i<n;i++)
    {
        b[i]=(a[i]-a[i-1]);
    }
    sort(b,b+n-1);
    for(i=1;i<n;i++)
    {
        m=min(m,__gcd(b[i-1],b[i]));  //这里)__gcd就是求最大公约数的,伙伴们也可以自己写一个
    
    }
    cout<<(a[n-1]-a[0])/m+1;
    return 0;
}

康康也不得不赞叹俩句,代码写的很是漂亮,可是你有没有想过假如是个常数列,咋办呢?

你是不是准备/0,让这个式子没有意义到飞起

所以,请多加一个特判,关于是否是常数列

下面是AC代码

#include<bits/stdc++.h>
using namespace std;
int a[100000],b[100000];
int main()
{
    int n,i,m=100000000,pd=0;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    for(i=1;i<n;i++)
    {
        b[i]=(a[i]-a[i-1]);
    if(b[i]==0)
    pd=1;    //这里的pd就是为了特判这个常数列
    }
    sort(b,b+n-1);
    for(i=1;i<n;i++)
    {
        m=min(m,__gcd(b[i-1],b[i]));
    
    }
    if(pd==1)
    {
        cout<<n;
    }
    else
    cout<<(a[n-1]-a[0])/m+1;
    return 0;
}

ps:如果你最大公约数函数也不会制作的话就看看这里吧

int gys(int x,int y)    //gys是公约数首拼音
{
    int t=min(x,y);
    while(t&&t>0)
    {
        if(x%t==0&&y%t==0) 
        {
            return t;
        }
        t--;
    }
}

今天就讲到这里吧,康康也饿啦!

举报

相关推荐

0 条评论