島嶼的數量(思維)

2021-08-02 17:02:00 字數 1714 閱讀 7845

題目:

有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。

給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如:

島嶼的高度為:, 查詢為:。

當海面高度為0時,所有的島形成了1個島嶼。

當海面高度為1時,島1會被淹沒,總共有2個島嶼 。

當海面高度為3時,所有島都會被淹沒,總共0個島嶼。

當海面高度為2時,島0, 1, 3會被淹沒,總共有2個島嶼 。

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 #include #include #include using namespace std;

const int maxn = 50010;

typedef struct node

node;

bool cmp(node a,node b)

node m[maxn];//島嶼

node q[maxn];//查詢

int sign[maxn];//標記

int ans[maxn];//結果

int main()

for(int i = 0; i < q; 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++)

/*if( m[j].p == 0 && sign[1])

sum--; foolish mistake

*/else if(m[j].p == m-1)

else

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;

}

島嶼的數量 (思維)

有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高度為 ...

51Nod 1276 島嶼的數量 思維

題目 有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高...

51nod 1276 島嶼的數量(思維題)

有n個島連在一起形成了乙個大的島嶼,如果海平面上公升超過某些島的高度時,則這個島會被淹沒。原本的大島嶼則會分為多個小島嶼,如果海平面一直上公升,則所有島都會被淹沒在水下。給出n個島的高度。然後有q個查詢,每個查詢給出乙個海平面的高度h,問當海平面高度達到h時,海上共有多少個島嶼。例如 島嶼的高度為 ...