試題 H: 等差數列
時間限制: 1.0s 內存限制: 256.0MB 本題總分:20 分
【問題描述】
數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一
部分的數列,只記得其中 N 個整數。
現在給出這 N 個整數,小明想知道包含這 N 個整數的最短的等差數列有
幾項?
【輸入格式】
輸入的第一行包含一個整數 N。
第二行包含 N 個整數 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 並不一定是按等差數
列中的順序給出)
【輸出格式】
輸出一個整數表示答案。
【樣例輸入】
5
2 6 4 10 20
【樣例輸出】
10
【樣例說明】
包含 2、6、4、10、20 的最短的等差數列是 2、4、6、8、10、12、14、16、
18、20。
【評測用例規模與約定】
對於所有評測用例,2 ≤ N ≤ 100000,0 ≤ A i ≤ 10^ 9 。//數組的maxn設置為100010,設置為int型
分析
①因為題目給出的是無序的,所以要用sort函數進行排序;
②求出最小公差,計算從首相加到尾項需要加多少公差即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=100010; 4 int main(){ 5 int n; 6 int a[maxn] ; 7 scanf("%d",&n); 8 //讀入數據並排列 9 for(int i=0;i<n;i++){ 10 scanf("%d",&a[i]); 11 } 12 sort(a,a+n); 13 //求公差 14 int d=a[1]-a[0]; 15 for(int i=2;i<n;i++){ 16 int t=a[i]-a[i-1]; 17 if(t<d) d=t; 18 } 19 //求項數 20 int ans=1; 21 while(a[0]!=a[n-1]){ 22 a[0]+=d; 23 ans++; 24 } 25 printf("%d",&ans); 26 }
