【CSP:202109-2】非零段划分(Java)
题目链接
- 202109-2 非零段划分
题目描述
求解思路
- 差分:根据本题给出的数据量:
a
[
]
a[]
a[] 数组中的每一个数均不超过
1
0
4
10^4
104,所以开辟大小为
1e4+10
的差分数组。 a
数组开辟的大小为n+1
,a[0]
的默认值为0。if (a[i] > a[i - 1])
:如果后一个数比前一个大,那么当p
取到它们中间的值时,就会把前边的数变成零,从而增加一个非零段;而当p
比a[i]
大的时候,这两个数字就都会变成0,没有了非零段。- 每次遍历的就
sum
相当于当p
取i
时存在的非零段数目,ans
记录其最大值。
实现代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n + 1];
int[] b = new int[(int) 1e4+10];
int ans = 0, sum = 0;
for (int i = 1; i <= n; i++) {
a[i] = in.nextInt();
if (a[i] > a[i - 1]) {
b[a[i - 1]] ++;
b[a[i]] --;
}
}
for (int i = 0; i < 1e4+10; i++) {
sum += b[i];
ans = Math.max(ans, sum);
}
System.out.println(ans);
}
}