那個曾經說要在一起永世不分離的人吶
現在又在哪裏
在路上
在路上
這題折騰了我好久!第一次做中大的的題目。
這題題目是統計露出水面的島嶼的個數,如果是幾個島嶼連在一起的就只算一個,一開始島嶼就是1。
如果一個島嶼的兩邊都是山的話+1
如果都是水的話-1
其他不用理
思路大概就是這樣
注:soj不能用qsort,這個弄得我一直不知道爲什麼老是顯示不能調用函數。所以我用了sort。
#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;
}