岛屿的数量(思维)

来源:互联网 发布:手机数据连接上不了网 编辑:程序博客网 时间:2024/04/30 03:54

题目:

有N个岛连在一起形成了一个大的岛屿,如果海平面上升超过某些岛的高度时,则这个岛会被淹没。原本的大岛屿则会分为多个小岛屿,如果海平面一直上升,则所有岛都会被淹没在水下。
给出N个岛的高度。然后有Q个查询,每个查询给出一个海平面的高度H,问当海平面高度达到H时,海上共有多少个岛屿。例如:
岛屿的高度为:{2, 1, 3, 2, 3}, 查询为:{0, 1, 3, 2}。
当海面高度为0时,所有的岛形成了1个岛屿。
当海面高度为1时,岛1会被淹没,总共有2个岛屿{2} {3, 2, 3}。
当海面高度为3时,所有岛都会被淹没,总共0个岛屿。
当海面高度为2时,岛0, 1, 3会被淹没,总共有2个岛屿{3} {3}。
Input
第1行:2个数N, Q中间用空格分隔,其中N为岛的数量,Q为查询的数量(1 <= N, Q <= 50000)。
第2 - N + 1行,每行1个数,对应N个岛屿的高度(1 <= A[i] <= 10^9)。
第N + 2 - N + Q + 1行,每行一个数,对应查询的海平面高度(1 <= Q[i] <= 10^9)。
Output
输出共Q行,对应每个查询的岛屿数量。
Input示例
5 4
2
1
3
2
3
0
1
3
2
Output示例
1
2
0
2

解题思路:

1.创建包括高度和下标的结构体,存储查询和岛屿,按高度升序排序。

2.用ans [] 数组存取结果。

3.遇到山谷 岛屿数量+1 ,遇到山峰岛屿数量-1,注意边缘处只可能是山峰。

#include <cstdio>#include <algorithm>#include <climits>#include <cstring>using namespace std;const int maxn = 50010;typedef struct node{    int h;//height    int p;//position}node;bool cmp(node a,node b){    return a.h < b.h;}node M[maxn];//岛屿node Q[maxn];//查询int sign[maxn];//标记int ans[maxn];//结果int main(){    int m,q;    scanf("%d%d",&m,&q);    for(int i = 0; i < m; i++)    {        scanf("%d",&M[i].h);        M[i].p = i;    }    for(int i = 0; i < q; i++)    {        scanf("%d",&Q[i].h);        Q[i].p = i;    }    sort(M,M+m,cmp);    sort(Q,Q+q,cmp);    int j = 0;    int sum = 1;//岛屿数量    memset(sign,0,sizeof(sign));    for(int i = 0; i < q; i++)    {        while(( M[j].h <= Q[i].h )&& j < m )        {            if(M[j].p == 0)            {                if(sign[1])   sum --; //左端点山峰                           }            /*            if( M[j].p == 0 && sign[1])                sum--;   foolish mistake            */            else if(M[j].p == m-1)            {                if( sign[m-2])  sum --; // 右端点山峰            }            else            {                if(sign[M[j].p - 1] && sign[M[j].p + 1]) // 中间部分的山峰                    sum --;                else if(!sign[M[j].p - 1] && !sign[M[j].p + 1])  // 中间部分的山谷                    sum ++;            }            sign[M[j].p] = 1;            j++;        }        ans[Q[i].p] = sum;    }    for(int i = 0; i < q; i++)        printf("%d\n",ans[i]);    return 0;}