思路
一个连续整数段其实就是一个差为 1 1 1 的等差数列,题目就是想让我们把题目给的数列变成一个差为 1 1 1 的等差数列。
一个差为 1 1 1 一的等差数列的首项 a 1 a _ 1 a1 和末项 a n a _ n an 之差肯定是 n − 1 n - 1 n−1。
我们先来分析几种情况:
-
a n − a 1 = n a _ n - a _ 1 = n an−a1=n
- a n − 1 a _ n - 1 an−1
- a 1 + 1 a _ 1 + 1 a1+1
-
a n − a 1 = n + 1 a _ n - a _ 1 = n + 1 an−a1=n+1
- a n − 1 a _ n - 1 an−1 and a 1 + 1 a _ 1 + 1 a1+1 $\to $最极端
-
$a _ n - a _ 1 \ge n + 2 $
- 不可以
既然最极端的也行,那么其他肯定行。我们只要判断最3极端的,如果行,输出YES,否则输出NO
代码
#include <bits/stdc++.h>
using namespace std;
int a[10000005] = {0};
int main(){
ios::sync_with_stdio(false);
int q;
cin >> q;
while (q--) {
int n1 = 10005, nn = -10005, n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
if (!i) { //if (i == 0)
n1 = a[i];
} else {
if (i == n - 1) {
nn = a[i];
}
}
}
if ((nn - n1) <= n + 1) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}