AcWing每日一题——岛

每当下雨时,农夫约翰的田地总是被洪水淹没。

由于田地不是完全水平的,所以一些地方充满水后,留下了许多被水隔开的“岛”。

约翰的田地被描述为由 N N N 个连续高度值 H 1 , H 2 . . . . H n H_1 , H_2....H_n H1,H2....Hn 指定的一维场景。

假设该场景被无限高的围墙包围着,请考虑暴雨期间发生的情况:

最低处首先被水覆盖,形成一些不连贯的岛,随着水位的不断上升,这些岛最终都会被覆盖。

一旦水位等于一块田地的高度,那块田地就被认为位于水下。

样例hhhhh
上图显示了一个示例:在左图中,我们只加入了刚好超过 1 单位的水,此时剩下 4 个岛(最大岛屿剩余数量),而在右图中,我们共加入了 7 单位的水,此时仅剩下 2 个岛。

请计算,暴风雨期间我们能在某个时间点看到的最大岛屿数量。

水会一直上升到所有田地都在水下。

输入格式
第一行包含整数 N N N

接下来 N N N 行,每行包含一个整数表示 H i H_i Hi

输出格式
输出暴风雨期间我们能在某个时间点看到的最大岛屿数量。

数据范围:
1 ≤ N ≤ 1 0 5 1≤N≤10^5 1N105
1 ≤ H i ≤ 1 0 9 1≤H_i≤10^9 1Hi109

分析:1.数据是离散的,也就是说雨水增长在两块田地之间是没有意义的
2.一次按序枚举每块田地的值,按照所有的这四种情况计算贡献,需要考虑边界情况
3.连续排列的需要去重,因为枚举的时候连续的两端情况是不知道的去重后,变为通过一块直接相连方便统计

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 7;
int h[N];
int n;
PII p[N];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> h[i];
    
    n = unique(h + 1 , h + n + 1) - h - 1; // 注意这里的unique只是把相邻相同的去除了,不是全部去重
    
    for (int i = 1; i <= n; i ++ ) p[i] = {h[i] , i};
    
    sort(p + 1 , p + n + 1);
    
    int res = 1 , cnt = 1;
    for (int i = 1; i <= n; i ++ )
    {
        int k = p[i].y;
        if (h[k] > h[k - 1] && h[k] > h[k + 1]) cnt --;
        if (h[k] < h[k - 1] && h[k] < h[k + 1]) cnt ++;
        
        if (p[i].x != p[i + 1].x) res = max(res , cnt); // 当存在多个相同地段同时被淹时不做判断//无法判断此时的岛屿情况
    }
    
    cout << res << endl;
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值