[藍橋杯 2019 省 B] 等差數列
題目描述
數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一部分的數列,只記得其中 N N N 個整數。
現在給出這 N N N 個整數,小明想知道包含這 N N N 個整數的最短的等差數列有幾項?
輸入格式
輸入的第一行包含一個整數 N N N。
第二行包含 N N N 個整數 A 1 , A 2 , ? , A N A_1,A_2,\cdots,A_N A1?,A2?,?,AN?。(注意 A 1 ~ A N A_1 ~ A_N A1?~AN? 并不一定是按等差數列中的順序給出 )。
輸出格式
輸出一個整數表示答案。
樣例 #1
樣例輸入 #1
5
2 6 4 10 20
樣例輸出 #1
10
提示
包含 2,6,4,10,20
的最短的等差數列是 2,4,6,8,10,12,14,16,18,20
。
對于所有評測用例, 2 ≤ N ≤ 1 0 5 2 \le N \le 10^5 2≤N≤105, 0 ≤ A i ≤ 1 0 9 0 \le A_i \le 10^9 0≤Ai?≤109。
藍橋杯 2019 年省賽 B 組 H 題。
思路
首先,定義一些常量和變量,包括數組大小N,數組a,還有一個使用輾轉相除法計算兩數最大公約數的函數gcd。
接著,從輸入中讀取了一個整數n,然后讀取了n個整數并存儲在數組a中。定義了一個整數d,用來存儲數組a中第二個元素和第一個元素的差值。然后對數組a進行了排序。
接下來,遍歷數組a,從第三個元素開始,計算每個元素和前一個元素的差值,然后用gcd函數求出這個差值和d的最大公約數,并將結果賦值給d。
最后,如果d不為0,輸出((a[n] - a[1]) / d + 1)
,否則輸出n。
注意
需要進行特判,當公差為0時,所有數都相同,直接輸出n,否則會引發除零異常。
AC代碼
#include <algorithm>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;int n;
int a[N];
int diff[N];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}int dmin = INF;sort(a + 1, a + n + 1);for (int i = 2; i <= n; i++) {diff[i] = a[i] - a[i - 1];dmin = min(dmin, diff[i]);}cout << (dmin ? ((a[n] - a[1]) / dmin + 1) : n) << "\n";return 0;
}