2022寒假算法训练-1.7

1.Acwing寒假每日一题:

2014. 岛 - AcWing题库

解题思路:将小岛排序,从低到高依次淹没,并计算改变后的小岛数量,取最大值

关键点:

1.去重(删掉左右两边同高度的小岛,视为一座岛)

2.根据被淹小岛的左右两边情况来判断小岛数量的增加或者减少

四种情况如下图:

 y总代码:

#include <iostream>
#include <cstring>
#include <algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

int n;
int h[N];
PII q[N];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &h[i]);

    n = unique(h + 1, h + n + 1) - h - 1;  // 判重

    for (int i = 1; i <= n; i ++ ) q[i] = {h[i], i};

    sort(q + 1, q + n + 1);

    int res = 1, cnt = 1;
    for (int i = 1; i <= n; i ++ )
    {
        int k = q[i].y;
        if (h[k - 1] < h[k] && h[k + 1] < h[k]) cnt -- ;
        else if (h[k - 1] > h[k] && h[k + 1] > h[k]) cnt ++ ;

        if (q[i].x != q[i + 1].x)  // 如果下一个高度相同,则不能更新答案
            res = max(res, cnt);
    }

    printf("%d\n", res);

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/2249182/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注意点:unique函数:可以参考如下网址 

 unique 函数 详解_小渣渣的博客-CSDN博客_unique函数

简单点说就是 除去相邻的重复元素。但unique并不是删除,而是将重复的元素移动到后面。

注意点:该函数的返回值为地址,

然后 y总是用该返回值减去h(数组的首地址)  我不清楚原理是什么 但是运行结果是可行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值