分析:等差數列,分析出關鍵的幾個數值就好了。最小項、最大項輸入後已知,公差d未定。
要求數列項數最短,那麼在所有滿足要求——》能加出所有項的公差集合裏找出最大的那個公差即可。
待解決:所有滿足要求的公差集合、以及集合中的最大值。
題太簡單容易引發簡單思維:
給輸入數列排序後,兩兩相鄰項求差值,相鄰差值最小項即所求公差。
這種方案能過樣例,但反例:2、8、12這組數據就不一樣了。兩兩相鄰差值爲6、4,顯然取4爲公差是錯誤行爲。
退一步發現取2可行,2的特徵爲6、4的最大公約數。。。
正確思路:
輸入數列排序後,兩兩相鄰求差值,得到差值數組,求差值數組兩兩的最大公約數。
公差集合:差值數組兩兩公約數組成的集合
#include<bits/stdc++.h>
using namespace std;
const int MaxN=100005; //最大測評用例數
int gcd(int n,int m){ //求最大公約數方法
return m == 0 ? n : gcd(m,n%m);
}
int main() {
//輸入信息
int N;
cin>>N;
int A[MaxN];
for(int i=0;i<N;i++){
cin>>A[i];
}
//諸神歸位(並未按等差順序給定數據)
sort(A,A+N);
//獲取兩兩間距
int distance[MaxN];
for(int i=1;i<N;i++){
distance[i-1]=A[i]-A[i-1];
}
/*
//省賽的時候腦袋一熱以爲兩兩差值最小即數列公差。。。
//錯誤示範
int Mind=distance[0];
for(int i=1;i<N-1;i++){
Mind=min(Mind,distance[i]);
}
*/
//使得該等差數列最短的公差
int Mind=distance[0];
for(int i=1;i<N-1;i++){
Mind=min(Mind,gcd(distance[i],distance[i-1]));
}
//數列最短長度
int ans=(A[N-1]-A[0])/Mind+1;
cout<<ans<<endl;
return 0;
}