等差數列

分析:等差數列,分析出關鍵的幾個數值就好了。最小項、最大項輸入後已知,公差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;
}

 

發佈了106 篇原創文章 · 獲贊 136 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章