岛屿Islands

题目:

题目描述

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

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

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

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

算出当雨从开始下到最后所有岛屿沉入水中,最多时可形成多少个岛屿。 ](https://img-blog.csdn.net/20170311102214153?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRXJpYzE1NjE3NTkzMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

作者思路:1.首先预处理:把相同高度的岛屿合并。
2.排序。
3.if a[i]>a[i-1] and a[i]>a[i+1] then inc(ans);反之亦然

代码:

var a,b,c:array[0..100001] of longint;
    i,j,m,n,ans,s,x:longint;
procedure qsort(l,r:longint);
var i,j,mid,t:longint;
begin
  if l>=r then exit;
  i:=l; j:=r;
  mid:=c[(l+r) div 2];
  repeat
    while (c[i]<mid) do inc(i);
    while (c[j]>mid) do dec(j);
    if i<=j then
    begin
      t:=c[i];c[i]:=c[j];c[j]:=t;
      t:=b[i];b[i]:=b[j];b[j]:=t;
      inc(i); dec(j);
    end;
  until i>j;
  if i<r then qsort(i,r);
  if l<j then qsort(l,j);
end;
begin
   {assign(input,'islands.in'); reset(input);
   assign(output,'islands.out'); rewrite(output);            }
   read(m);
   for i:=1 to m do
   begin
     read(x);
     if x<>a[n] then
     begin
       inc(n);
       a[n]:=x;
       b[n]:=n;
     end;
   end;
   c:=a;
   s:=1;
   qsort(1,n);
   for i:=1 to n do
   begin
     if (a[b[i]-1]>a[b[i]]) and (a[b[i]+1]>a[b[i]])then inc(s);
     if (a[b[i]-1]<=a[b[i]]) and (a[b[i]+1]<=a[b[i]])then dec(s);
     if s>ans then ans:=s;
   end;
   write(ans);
{   close(input); close(output);                               }
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值