首页 > 其他分享 >蓝桥杯每日真题 - 第7天

蓝桥杯每日真题 - 第7天

时间:2024-11-10 13:18:57浏览次数:3  
标签:真题 每日 long 蓝桥 查找 差值 数组 区间 multiset

题目:(爬山)

题目描述(X届 C&C++ B组X题)

解题思路:

  • 前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组 a,其中 a[i] 表示从第 1 个元素到第 i 个元素的和。这样,对于任意区间 [i, j] 的子数组和,可以通过 a[j] - a[i-1] 快速得到。

  • 枚举所有区间和:用双重循环枚举所有可能的区间 [i, j],将每个区间和存入 multiset s 中。multiset 支持快速查找、插入和删除,且自动排序,是处理该问题的合适选择。

  • 最小差值的计算

    • 遍历每一个位置 i,将该位置作为第一个区间的右端点。

    • multiset 中删除以 i 作为右端点的所有区间和,以避免区间重叠。

    • 然后遍历每一个可能的左端点 j,计算第一个区间 [j, i] 的和 k = a[i] - a[j-1]

    • 使用 lower_bound 查找 s 中最接近 k 的区间和,计算绝对差值,并更新最小差值 res

    • lower_bound 查找时,考虑 s 中前后两个元素,以确保找到最接近 k 的数值。

  • 输出结果:最终输出最小的差值 res

代码实现(C++):

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
long long a[N];
int n;
multiset<long long>s;
long long minn(long long a,long long b){
    if(a<b) return a;
    else return b;
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同步流
    cin>>n;
    for(int i = 1;i<=n;i++) {
        cin>>a[i];
        a[i]+=a[i-1];//构造前缀和
    }
    for(int i = 1;i<=n;i++){
        for(int j = i;j<=n;j++){
            s.insert(a[j]-a[i-1]);//枚举右区间所有情况先加入set中
        }
    }
    long long res = 1e9;
    //这里的i是第一个区间的右端点
    for(int i = 1;i<n;i++){
        //删除掉以i作为右区间第一个数字的情况
        for(int j = i;j<=n;j++){
//             auto p = s.find(a[j]-a[i-1]);
//             s.erase(p);
               auto k = a[j] - a[i-1];
                s.erase(s.find(k));
        }

        //这里的j是第一个区间的左端点
        for(int j = 1;j<=i;j++){
            auto k = a[i] - a[j-1];

            //找到又区间中最接近k的位置,用lower_bound(s.begin(),s.end(),k)
            //会慢很多,不建议
            auto p = s.lower_bound(k);
            if(p!=s.end()){
                res = minn(res,abs(*p-k));
            }
            if(p!=s.begin()){
                p--;
                res = minn(res,abs(*p-k));
                //lower_bound返回的是第一个>=k的数字,因此绝对值最小的情况也可能在p前面一点
            }
        }
    }
    cout<<res<<endl;
    return 0;
}

代码分析:

  • 头文件和常量定义

    • 引入头文件 #include <bits/stdc++.h>,方便使用标准库的各种数据结构和算法。

    • 定义常量 N 为数组的最大长度(设置为 1000)。

    • 定义数组 a[N] 用于存储前缀和,n 表示元素数量。

    • 使用 multiset s 存储所有子数组的和,支持排序和快速查找。

  • 辅助函数 minn

    • minn 函数用于返回两个数中的较小值,这个函数会在更新最小差值时使用。

    • 使用辅助函数代替 std::min 可以提高代码可读性。

  • 初始化和输入

    • ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 是用于加快 I/O 操作的优化。

    • 读取输入 n 和数组元素,构造前缀和 a[i] += a[i - 1];a[i] 表示从第一个元素到第 i 个元素的和。

    • 构造前缀和后,可以通过 a[j] - a[i - 1] 快速获得区间 [i, j] 的和。

  • 枚举所有区间和并加入 multiset

    • 双重循环枚举所有可能的区间 [i, j]

    • 每个区间和通过 a[j] - a[i - 1] 计算,并插入 multiset s 中。

    • 使用 multiset 是因为它支持自动排序和快速查找最接近的值。

  • 枚举区间、删除重叠区间和查找最小差值

    • 外层循环的 i 表示第一个区间的右端点。

    • 内部循环先删除以 i 为右端点的所有区间和,避免第一个区间和第二个区间重叠。

    • 对于当前右端点 i,再枚举每个可能的左端点 j,计算第一个区间 [j, i] 的和 k = a[i] - a[j-1]

    • 使用 lower_bound 查找 s 中最接近 k 的值。由于 lower_bound 返回的是第一个大于等于 k 的迭代器 p,所以还需要检查 p 的前一个元素,以找到绝对差值最小的情况。

    • 最小差值存储在 res 中。

难度分析

⭐️⭐️⭐️⭐️ 

总结

  • 使用前缀和快速计算子数组和。

  • 使用 multiset 存储所有子数组和,以支持有序查找和删除操作。

  • 通过双重循环枚举区间和,并使用 lower_bound 查找最接近的数值,从而找到两个不重叠子数组和之间的最小差值。

标签:真题,每日,long,蓝桥,查找,差值,数组,区间,multiset
From: https://blog.csdn.net/weixin_74066588/article/details/143632365

相关文章

  • 每日一题.设计相邻元素求和服务;暴力算法与哈希表的运用
    本题出自LeetCode每日一题3242,可以说比昨天的那道“每日抑题”简单不少呀,就是代码长一点,同时本题目使用了两种不同的方法,并对每一种用法进行了深度解析。本文全长5000字。题目 给你一个 nxn 的二维数组 grid,它包含范围 [0,n2-1] 内的不重复元素。实现 neighbo......
  • sicp每日一题[2.73]
    最近状态不太好,再加上2.73前面的内容有点多,学的有点吃力,所以昨天就没做。。Exercise2.73Section2.3.2describedaprogramthatperformssymbolicdifferentiation:(define(derivexpvar)(cond((number?exp)0)((variable?exp)(if(same-va......
  • 【软考】系统架构设计师-2015年下半年下午论文真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2015年下半年下午试卷 论文试题一 论应用服务器基础软件应用服务器是在当今基于互联网的企业级应用迅速发展,电子商务应用出现并快速膨胀的需求下产生的一种新技术。在分布式、多层结构及基于组件和......
  • 【软考】系统架构设计师-2016年下半年上午综合知识真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2016年下半年上午试卷 综合知识试题一 在嵌入式系统的存储部件中,存取速度最快的是( )。A.内存  B.寄存器组  C.Flash  D. Cache试题二 实时操作系统(RTOS)内核与应用程序之间的接口称......
  • 华为OD机试2024年真题题库(A卷+B卷+C卷+D卷+E卷)
    文章目录一、什么是华为OD,什么是华为OD机试?二、华为OD面试流程?三、华为OD机试通过率高吗?四、华为OD薪资待遇?五、大家比较关注问题的FAQ......
  • 【华为OD技术面试手撕真题】82、环形链表II | 手撕真题+思路参考+代码解析(C & C++ & J
    文章目录一、题目......
  • 【蓝桥杯 2021 省 B2】特殊年份
    题目描述:今年是2021年,2021这个数字非常特殊,它的千位和十位相等,个位比百位大11,我们称满足这样条件的年份为特殊年份。输入55个年份,请计算这里面有多少个特殊年份。输入格式输入55行,每行一个44位十进制数(数值范围为10001000至99999999),表示一个年份。输出......
  • 每日OJ题_牛客_BC157素数回文_数学_C++_Java
    目录牛客_BC157素数回文_数学题目解析C++代码Java代码牛客_BC157素数回文_数学素数回文_牛客题霸_牛客网描述:现在给出一个素数,这个素数满足两点:1、  只由1-9组成,并且每个数只出现一次,如13,23,1289。2、  位数从高到低为递减或递增,如2459,87631。请你判断一下,这......
  • GitHub每日最火火火项目(11.7)
    项目名称:DataExpert-io/data-engineer-handbook项目介绍:“DataExpert-io/data-engineer-handbook”是一个非常有价值的资源库。这个项目收集了与数据工程相关的各种学习链接,涵盖了数据工程领域的方方面面。对于想要深入了解数据工程的人来说,它就像是一个知识宝库。无论是......
  • Leetcode 每日一题 135.分发糖果
    问题描述给定一个整数数组ratings,表示一排孩子的评分。我们需要按照以下规则给孩子们分发糖果:每个孩子至少得到1个糖果。相邻两个孩子中,评分更高的孩子会得到更多的糖果。我们的目标是计算出按照这些规则分发糖果所需的最少糖果数。输入输出格式输入:一个整数数组 rating......