暴力法(70)java实现:
import java.util.Scanner;
/**
* @author liuxun
* @create 2022-02-05 21:21
* @description
*/
public class r2021_09_2 {
public static void main(String[] args){
int n;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] num = new int[500000];
for (int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
int maxSum = 0;
for (int i =0; i<=10000;i++){
boolean flag = true;
int sum =0;
for(int j =0;j<n;j++){
if(num[j]>i&&flag){
sum++;
flag=false;
}
if(num[j]<=i){
flag =true;
}
}
if(sum>maxSum){
maxSum = sum;
}
}
System.out.println(maxSum);
}
}
索引法 c++实现:
#include<iostream>//42min + 30min
#include<vector>
using namespace std;
int const N = 5*100000;
int a[N];//存储每一个具体数据
int range[N];//存储为抽象的 0 1 0 代表 < p 1 代表 >= p
vector<int>v[10000+1];//每一个v[i]存储对应 所有 i 的位置
int main(){
int n;
int last = 1;//last为上一次划分数,p = 0 时,last = 1
cin >> n;
int maxa = 0;
for(int i = 1;i <= n;i++){
cin >> a[i];
v[a[i]].push_back(i);
if(a[i] > maxa){
maxa = a[i];
}
range[i] = 1;
}
range[0] = 0;
range[n + 1] = 0;
int max = 0;
for(int p = 0;p <= maxa;p++){
if(v[p].size() != 0){//将小于p的数在range数组中标记为0,这里相当于将条件改成了<=p 的改为 1,题目不追究p影响不大
int t = last;
for(int i = 0;i < v[p].size();i++){
range[ v[p][i] ]= 0;//将v[p]中的所有都置为 0
if(range[ v[p][i] - 1] == 0 && range[ v[p][i] + 1] == 0){
t--;
}else if(range[ v[p][i] - 1] == 1 && range[ v[p][i] + 1] == 1){
t++;
}
}
if(max < last) max = last;
if(max < t) max = t;
last = t;
}
}
cout<<max;
}