岛屿的数量(思维)
来源:互联网 发布:手机数据连接上不了网 编辑:程序博客网 时间: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;}
阅读全文
3 0
- 岛屿的数量(思维)
- 岛屿的数量(思维+搞笑+扯淡)(细节分析)
- 51nod 1276 岛屿的数量(思维题)
- 51nod 1276 岛屿的数量(思维)
- 51nod 1276 岛屿的数量(贪心策略__锻炼思维)
- 51NOD 1276 岛屿的数量(脑洞 + 思维)
- 51nod 1276 岛屿的数量【思维】好题~
- 51NOD 1276 岛屿的数量(脑洞+思维)
- 1276 岛屿的数量
- 岛屿的数量
- LeetCode之岛屿的数量
- 岛屿的数量 51Nod
- 岛屿的数量 51Nod
- 51nod 1276 岛屿的数量(锻炼思维的好题)
- 51nod 1276 岛屿的数量 思维题,很棒的题目
- 51nod 1276 岛屿的数量(乱搞)
- 51nod 1276:岛屿的数量 (贪心)
- 51NOD 1276 岛屿的数量
- org.apache.http不存在或找不到,解决方案
- pollard's rho算法(使用GMP库)
- 精通CSS(4.4opacity&RGBa)&&黑客与画家(2)
- 【Oracle】单行函数
- 欢迎使用CSDN-markdown编辑器
- 岛屿的数量(思维)
- js 正则
- activiti 涉及到的表
- MTK进阶计划
- 计算机网络复习
- 流程部署
- Python运行程序
- android.mk中几个常见配置
- 使用工作流接口对工作流的表进行查询