题解 | #超现实字串#
超现实子串
https://ac.nowcoder.com/acm/contest/51721/B
首先,这个题的数据很水。。。非常水。
本题没有什么思维含量,因为数据量不是很大,可以采用非常简单暴力的思路:
先创建一个布尔型的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;
}