题目链接:
计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T130
【分析】其实这道题是一个差分+前缀和的问题,我们可以这么想,每当出现一个数比前一个数大时,例如数组为[2, 4]时,说明在这个区间内可以产生一次划分,然后对于[5, 8]又可以产生一个划分,相当于对原数组[0, 1, 2, 3, 4, 5, 6, 7, 8]中的区间[2, 4], [5, 8] + 1,最后算一下前缀和,也就是能产生交集的数量就是通过这个数能够产生的划分了。
先贴一个暴力能拿70分再说
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
int i, ans = 0;
HashSet<Integer> set =new HashSet<>();
int start = 100001, end = -1;
for(i = 0; i < n; i++){
arr[i] = scanner.nextInt();
set.add(arr[i]);
set.add(arr[i]);
}
int pre = 0;
int j, a, max;
for(Integer it: set){
if(it == 0) continue;
max = 0;
pre = 0;
for(i = 0; i < n; i++){
if(arr[i] < it && pre == 1) {
max++;
pre = 0;
}else if(arr[i] >= it){
pre = 1;
}
}
if(pre == 1) max++;
ans = Math.max(ans, max);
}
System.out.println(ans);
}
}
差分+前缀和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] cnt = new int[10002];
int[] arr = new int[500002];
int i;
for(i = 1; i <= n; i++){
arr[i] = scanner.nextInt();
if(arr[i] > arr[i - 1]){
cnt[arr[i - 1] + 1]++;
cnt[arr[i] + 1]--;
}
}
int ans = cnt[0];
for(i = 1; i < 10002; i++){
cnt[i] += cnt[i - 1];
ans = Math.max(ans, cnt[i]);
}
System.out.println(ans);
}
}