中大sicily9095 soj9095


那個曾經說要在一起永世不分離的人吶

現在又在哪裏

在路上

在路上                                   

 

這題折騰了我好久!第一次做中大的的題目。

這題題目是統計露出水面的島嶼的個數,如果是幾個島嶼連在一起的就只算一個,一開始島嶼就是1。

如果一個島嶼的兩邊都是山的話+1

如果都是水的話-1

其他不用理

思路大概就是這樣

注:soj不能用qsort,這個弄得我一直不知道爲什麼老是顯示不能調用函數。所以我用了sort。

 

 題目:http://soj.me/9095

 

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <algorithm>
using namespace std;
struct calu
{
 int h;
 int num;
}a[100005],b[100005];  //這裏我開了兩個數組,a用來存放排序後的,b用來存放初始的
int Max(int a,int b)
{
 if(a>b)return a;
 else return b;
}

bool cmp( struct calu kk ,struct calu kt)
{
 if(kk.h>kt.h)
  return false;
 else
  return true;
}
int main()
{
 int m,i,j,zuo,you,N,flag[100005],fuk,ans;
 while(scanf("%d",&N)!=EOF)
 {
  memset(flag,0,sizeof(flag));
  for(i=0;i<N;i++)
  {
   scanf("%d",&a[i].h);
   a[i].num=i;
   b[i]=a[i];
  }
  sort(a,a+N,cmp);
  a[N].h=1;
  m=1,ans=1;
  for(j=0;j<N;) //一個循環
  {
   fuk=a[j].h;
   while(fuk==a[j].h) //這裏是找相同的,一般不可能出現10萬個相同的所以不用怕超時
   {
    if(flag[a[j].num]==0)
    {
     flag[a[j].num]=-1;
     you=a[j].num+1; //右標記一直到不同的高度
     while(you<N && flag[you]==0 && b[you].h==fuk)
     {
      flag[you]=-1;
      you++; 
     }
     zuo=a[j].num-1; //左標記一直到不同的高度
     while(zuo<N && flag[zuo]==0 && b[zuo].h==fuk)
     {
      flag[zuo]=-1;
      zuo--;
     }
     if((you>=N || flag[you]==-1) && (zuo<0 || flag[zuo]==-1))  //如果一個島嶼的兩邊都是水的話-1
                        m--;
     if((you<N && flag[you]==0) && (zuo>=0 && flag[zuo]==0))  //如果一個島嶼的兩邊都是山的話+1
                        m++;
    }
    j++;
   }
   ans=Max(m,ans);
  }
  printf("%d\n",ans);
 }
 return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章