2017.03.10【NOIP 普及組】模擬賽C組 島嶼Islands 題解

原題:

http://172.16.0.132/junior/#contest/show/1375/1

題目描述:

每當下雨時,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

分析:

模擬······

實現:

#include<cstdio>
#include<cstring>

int ans,sum=1,t,n,i,a,w[100007],s[100007],bz[100007];
void sort(int x,int y)
{
    int i,j,mid;
    i=x;
    j=y;
    mid=w[x];
    do
    {
        while(w[i]<mid) i++;
        while(w[j]>mid) j--;
        if(i<=j)
        {
            w[0]=w[i]; w[i]=w[j]; w[j]=w[0];
            bz[0]=bz[i]; bz[i]=bz[j]; bz[j]=bz[0];
            i++; j--;
        }
    }
    while(i<=j);
    if(i<y) sort(i,y);
    if(x<j) sort(x,j);
}
int main()
{
    freopen("islands.in","r",stdin);freopen("islands.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++) 
    {
        scanf("%d",&a);
        if(a!=s[t])
        {
            t++;
            s[t]=a;
            bz[t]=t;        
        }
    }
    memcpy(w,s,sizeof(s));
    sort(1,n);
    for(i=1;i<=n;i++)
    {
        if(s[bz[i]-1]>s[bz[i]]&&s[bz[i]+1]>s[bz[i]]) sum++;
        if(s[bz[i]-1]<=s[bz[i]]&&s[bz[i]+1]<=s[bz[i]]) sum--;
        if(sum>ans) ans=sum;
    }
    printf("%d\n",ans);
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章