2019年省賽第十屆藍橋杯B組C/C++試題H解 等差數列

Rlynn發表於2020-10-09

試題 H: 等差數列

時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分
【問題描述】
數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一
部分的數列,只記得其中 N 個整數。
現在給出這 N 個整數,小明想知道包含這 N 個整數的最短的等差數列有
幾項?
【輸入格式】
輸入的第一行包含一個整數 N。
第二行包含 N 個整數 A1, A2, · · · , AN。(注意 A1 ∼ AN 並不一定是按等差數
列中的順序給出)
【輸出格式】
輸出一個整數表示答案。
【樣例輸入】
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 ≤ Ai ≤ 109。

思路:
等差數列求第n項:a(n)=a(1)+d*(n-1)。
如果不知道可以求出公差,再迴圈累加計數也可以得到答案。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
 int n,d,ans,a[100005];
 cin>>n;
 for(int i=0;i<n;i++){
  cin>>a[i];
 }
 sort(a,a+n);
 d=a[1]-a[0];
 for(int i=1;i<n-1;i++){ //排除前兩項差不是公差的情況 
  if(a[i+1]-a[i]<d){
   d=a[i+1]-a[i];
  }
 }
 if(d==0){
  ans=n;
 }else{
  ans=(a[n-1]-a[0])/d+1; //等差數列求第n項:a(n)=a(1)+d*(n-1)
 }
 cout<<ans<<endl;
 return 0;
} 

相關文章