蓝桥杯省赛,连号区间数,规律,枚举

该C++代码实现了一个算法,用于统计给定数组中满足元素最大值与最小值差等于子数组长度的子数组数量。它使用了两个变量minv和maxv来跟踪区间内的最小值和最大值,遍历每个子数组并检查条件。
摘要由CSDN通过智能技术生成
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010, INF = 100000000;

int n;
int a[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> a[i];

    int res = 0;
    for (int i = 0; i < n; i ++ )   // 枚举区间左端点
    {
        int minv = INF, maxv = -INF;
        for (int j = i; j < n; j ++ )   // 枚举区间右端点
        {
            minv = min(minv, a[j]);
            maxv = max(maxv, a[j]);
            if (maxv - minv == j - i) res ++ ;
        }
    }

    cout << res << endl;

    return 0;
}

maxv和minv是用来记录当前枚举区间[i,j]中的最大值和最小值的变量。在每次枚举j时,都会更新maxv和minv,以保证它们分别记录的是当前区间[i,j]中的最大值和最小值。这样,就可以在O(1)的时间内计算出当前区间的最大值和最小值。

这段代码是在求一个数组中所有子数组中,元素的最大值和最小值之差等于子数组长度的子数组个数。

if (maxv - minv == j - i)这个if语句的作用是判断当前子数组是否符合条件,即元素的最大值和最小值之差等于子数组长度。如果符合条件,就将结果res加1。

其中,maxv表示当前子数组中的最大值,minv表示当前子数组中的最小值,j表示当前子数组的右端点,i表示当前子数组的左端点。因为是枚举所有子数组,所以i和j的循环都是从0到n-1。

举个例子,假设当前子数组为[3, 1, 2, 4, 5],则maxv为5,minv为1,j-i为4,maxv-minv为4,符合条件,结果res加1。

需要注意的是,由于数组中可能存在负数,因此在初始化最大值和最小值时,需要将它们分别赋值为负无穷和正无穷,以确保能够正确计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值