CCF-CSP202109-2 非零段划分

151 阅读1分钟

image.png

image.png

image.png

解题思路: 这道题用一般暴力解法只能得到70分。 因此,我们来分析一下岛屿的情况,当P非常大的时候,所有的数都会被海水淹没,此时没有岛屿,岛屿数为0,然后,P慢慢减小(也就是海平面逐渐下降),岛屿数就会出现变化,每当一个凸峰出现,岛屿数就会多一个,每当一个凹谷出现,岛屿数就减少一个(原本相邻的两个岛屿被这个凹谷连接在一起了)。 在用程序实现时,值得注意的是,需要去除相邻重复的元素。

import java.util.*;    
public class Main{

  public static void main(String[] args) {
	Scanner in =new Scanner(System.in);
	int n=in.nextInt();
	int arr[]=new int[n+2];
	arr[0]=arr[n+1]=0;  //用来设置边界值,起辅助计算的作用,简化程序代码
	for(int i=1;i<=n;i++) {
		arr[i]=in.nextInt();
	}
	
	int d[]=new int [10001];  //d[i]表示海平面下降到i时,岛屿数量的变化
	int brr[]=new int [arr.length];
	brr[0]=0;
	int j=1;
      for(int i=1;i<=n;i++) {
    	if(arr[i]==arr[i-1]) {
    		continue;
    	}else {
    		brr[j]=arr[i];
    		j++;
    	}
      }
      brr[j]=0;
    
	for(int i=1;i<j;i++) {
		if(brr[i-1]<brr[i]&&brr[i]>brr[i+1])
			d[brr[i]]++;
		else if(brr[i-1]>brr[i]&&brr[i]<brr[i+1])
			d[brr[i]]--;
	}
	int ans=0,sum=0;
	for(int i=10000;i>=1;i--) {
		sum+=d[i];
		ans=Math.max(ans,sum);
	}
	System.out.println(ans);
  }
}