JZOJ 3.10 1540——岛屿

题目描述

每当下雨时,FJ的牧场都会进水。由于牧场地面高低不平,被水淹没的地方不是很统一,形成一些岛屿。

FJ的牧场可描述成一个一维的地形图,由N(1 <= N <= 100,000)个彼此相连的柱状的高度值组成。高度值为H(1)…H(n)。假定这个地形图的两端有两条无限高的墙围着。

这里写图片描述
当雨一直下时,地形图上最低的区域先被水淹没,形成一些不相邻的岛屿。一旦水面高度到达一个区域的高度,则认为这个区域被淹没。

左图,在当前水面时,有4个岛屿。右图,在水面升高后,剩下2个岛屿。显然,最终所有的区域都会沉入水面。

算出当雨从开始下到最后所有岛屿沉入水中,最多时可形成多少个岛屿。

输入

第1行:1个整数N

第2..N+1行:每行一个整数,表示一个区域的高度H(i). (1 <= H(i) <= 1,000,000,000)

输出

第1行: 1个整数,表示最多时能看到的岛屿数

样例输入

8

3

5

2

3

1

4

2

3

样例输出

4


感谢上天,终于让我ACC了
分析:
步骤一:现将高度从矮到高排序,将同样高度而且为相邻的岛屿合并。
步骤二:循环,枚举如果淹没了i这个区域的岛屿数
如果这个区域的左边和右边都没有被淹没,就将岛屿数加一;如果这个区域的左边和右边都被淹没了,则岛屿数减一。如果当前岛屿数大于max,则更新最大值。


代码如下:

var  a,b,c:array[0..100001]of longint;
     i,j,ans,max,n,x,m:longint;

procedure qsort(l,r:longint);
var  i,j,mid:longint;
begin
  if l>=r then exit;
  i:=l; j:=r; mid:=a[(l+r) div 2];
  repeat
    while a[i]<mid do inc(i);
    while a[j]>mid do dec(j);
    if i<=j then
      begin
        a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
        b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
        inc(i);
        dec(j);
      end;
  until i>j;
  qsort(l,j);
  qsort(i,r);
end;

begin
  assign(input,'islands.in');
  assign(output,'islands.out');
  reset(input);
  rewrite(output);
  readln(m);
  n:=0;
  for i:=1 to m do
    begin
      readln(x);
      if x<>c[n] then
        begin
          inc(n);
          c[n]:=x;
          b[n]:=n;
        end;
    end;
  a:=c;
  qsort(1,n);
  ans:=1;
  for i:=1 to n do
    begin
      if (c[b[i]-1]>c[b[i]])and(c[b[i]+1]>c[b[i]]) then inc(ans);
      if (c[b[i]-1]<=c[b[i]])and(c[b[i]+1]<=c[b[i]]) then dec(ans);
      if max<ans then max:=ans;
    end;
  write(max);
  close(input);
  close(output);
end.
posted @ 2017-03-11 11:46  BEYang_Z  阅读(151)  评论(0编辑  收藏  举报