今天看了一下,这个题目的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--;
}
}
今天就讲到这里吧,康康也饿啦!