P9517 题解

思路分析

我们只需要找到左边第一个大于 \(0\) 的位置 \(l\) 与右边第一个大于 \(0\) 的位置 \(r\),输出 \(r-l+1\) 即可。

但是很坑的一点是,如果 \(∀i∈[1,n],a_i=0\),那么 \(l\)\(r\) 会重合,代码会输出 \(1\)!所以,我们需要定义一个 \(flag\) 来标记是否全部输入为 \(0\)

代码实现

#include <bits/stdc++.h>
using namespace std;
int n, l, r;
bool flag = true;
int main() {
	cin >> n;
	vector<int> a(n);
	for (auto &x : a) {
		cin >> x;
		if (x != 0) flag = false; // 如果非0那么就不需要特判了
	}
	if (flag) { // 如果全部为0,那么就输出0
		cout << 0;
		return 0;
	}
	for (l = 0; l < n; l++)
		if (a[l] >= 1) break; // 从左端开始找到第一个大于0的位置
	for (r = n - 1; r >= 0; r--)
		if (a[r] >= 1) break; // 从左端开始找到第一个大于0的位置
	cout << r - l + 1; // 一定要加1,否则就把l也去掉了
	return 0;
}
posted @ 2023-09-10 13:47  群星之路  阅读(10)  评论(0)    收藏  举报