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; beginif l>=r then exit;i:=l; j:=r; mid:=a[(l+r) div 2];repeatwhile a[i]<mid do inc(i);while a[j]>mid do dec(j);if i<=j thenbegina[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;beginassign(input,'islands.in');assign(output,'islands.out');reset(input);rewrite(output);readln(m);n:=0;for i:=1 to m dobeginreadln(x);if x<>c[n] thenbegininc(n);c[n]:=x;b[n]:=n;end;end;a:=c;qsort(1,n);ans:=1;for i:=1 to n dobeginif (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.轉載于:https://www.cnblogs.com/Comfortable/p/8412377.html
總結
以上是生活随笔為你收集整理的JZOJ 3.10 1540——岛屿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unix shell(壳)的简单实现
- 下一篇: spring框架学习(一)入门