首先,这个题的数据很水。。。非常水。

本题没有什么思维含量,因为数据量不是很大,可以采用非常简单暴力的思路:

先创建一个布尔型的check函数,如下所示:

bool check(int s1, int sn, int n) { //s1,sn,n
	if (n == 1) {
		return 1;
	}
	if (n % 2 == 0) {
		if (sn == s1 + n / 2) {
			return 1;
		} else
			return 0;
	} else {
		if (sn == s1 - n / 2)
			return 1;
		else
			return 0;
	}
}

通过观察超现实子列的规律可以得到这样的结论:当n为偶数时,第n项的值是s1+n/2,而奇数时是s1-n/2。那么首先确定首项s1,然后就看后面的项是否符合规则即可。符合规则输出1,不符合输出0,这里要注意第一项没有判断的必要,直接1就可以。

之后如何判断?

先将数据填到数组里,之后的思路无非就是:先确定一个首项,然后往后遍历;一旦返回0就停止遍历,记录字串的长度,后移一位,重新开始遍历。

上完整代码:

using namespace std;
int n;

int a[1000004] = {};
int num1 = 0, num2 = 0; //length

bool check(int s1, int sn, int n) { //s1,sn,n
	if (n == 1) {
		return 1;
	}
	if (n % 2 == 0) {
		if (sn == s1 + n / 2) {
			return 1;
		} else
			return 0;
	} else {
		if (sn == s1 - n / 2)
			return 1;
		else
			return 0;
	}
}

int main() {
	ios::sync_with_stdio(false);//取消cin和cout的同步
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	bool e;
	for (int i = 1, j = 1; i <= n, j <= n; i++) {//i的初始值为1做起来会方便一点
		e = check(a[j], a[i], i - j + 1);//j决定首项,i负责遍历
		if (e) {
			num1++;
		} else {
			if (num2 < num1)
				num2 = num1;
			num1 = 0;//遍历完别忘了把num1归零
			j ++;
			i = j - 1;//i要跟着j回去
		}
	}
	cout << num2;
	return 0;
}