首页 > 编程语言 >【华为OD机试】真题A卷-连接器问题(C++)

【华为OD机试】真题A卷-连接器问题(C++)

时间:2024-03-23 20:59:03浏览次数:16  
标签:真题 connectorStr OD ranges vector 连接器 rangeStr include

一、题目描述

【华为OD机试】真题A卷-连接器问题(C++)

题目描述:

有一组区间[a0,b0],[a1,b1],…(a,b表示起点,终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间;
给定一组连接器[x1,x2,x3,…](x表示连接器的最大可连接长度,即x>=gap),可用于将分离的区间连接起来,但两个分离区间之间只能使用1个连接器;
请编程实现使用连接器后,最少的区间数结果。
区间数量<10000,a,b均 <=10000

连接器梳理<10000;x <= 10000

二、输入输出

输入描述:
区间组:[1,10],[15,20],[18,30],[33,40] 
连接器组:[5,4,3,2]
输出描述:
1
说明:
合并后:[1,10],[15,30],[33,40],使用5, 3两个连接器连接后只剩下 [1, 40]。

三、参考示例

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
[1,10],[15,20],[18,30],[33,40]
[5,4,3,2]
输出:
1
说明:
合并后:[1,10], [15,30], [33,40],使用5, 3两个连接器连接后只剩下[1,40]。

四、解题思路

  1. 编写splitString函数,将输入的字符串按逗号分隔转换为整数数组。
  2. 定义自定义比较函数compareRanges,用于对区间进行排序。
  3. 处理输入,读取并处理输入的ranges和connectors。
  4. 对ranges进行排序,按照区间的起始值进行排序。
  5. 合并重叠区间,计算区间之间的距离并排序。
  6. 对connectors和区间距离进行排序。
  7. 使用贪心算法,根据条件更新结果result。

五、参考代码

/*
 * @Author: mgc
 * @Date: 2024-02-02 17:47:00
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-02-02 17:48:55
 */

// #include<set>
// #include<map>
// #include<list>
// #include<regex>
// #include<cmath>
// #include<queue>
// #include<stack>
// #include<bitset>
// #include<utility>
// #include<stdlib.h>
// #include<string.h>


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

// 将输入字符串按逗号分隔转换为整数数组
vector<int> splitString(string inputStr) {
    vector<int> result;
    size_t pos = 0;
    while ((pos = inputStr.find(",")) != string::npos) {
        result.push_back(stoi(inputStr.substr(0, pos)));
        inputStr.erase(0, pos + 1);
    }
    result.push_back(stoi(inputStr));
    return result;
}

// 自定义比较函数,用于区间排序
bool compareRanges(vector<int>& a, vector<int>& b) {
    if (a[0] > b[0]) {
        return false;
    } else if (a[0] == b[0]) {
        if (a[1] > b[1]) {
            return false;
        }
    }
    return true;
}

int main() {
    // 输入处理
    string rangeStr, connectorStr;
    cin >> rangeStr;
    rangeStr.erase(remove(rangeStr.begin(), rangeStr.end(), '['), rangeStr.end());
    rangeStr.erase(remove(rangeStr.begin(), rangeStr.end(), ']'), rangeStr.end());
    vector<int> tempRanges = splitString(rangeStr);

    vector<vector<int>> ranges;
    for (int i = 0; i < tempRanges.size(); i++) {
        if (i % 2 != 0) {
            vector<int> singleRange;
            singleRange.push_back(tempRanges[i - 1]);
            singleRange.push_back(tempRanges[i]);
            ranges.push_back(singleRange);
        }
    }

    cin >> connectorStr;
    connectorStr.erase(remove(connectorStr.begin(), connectorStr.end(), '['),
                       connectorStr.end());
    connectorStr.erase(remove(connectorStr.begin(), connectorStr.end(), ']'),
                       connectorStr.end());
    vector<int> connectors = splitString(connectorStr);

    sort(ranges.begin(), ranges.end(), compareRanges);

    // 合并区间
    vector<vector<int>> mergedRanges;
    mergedRanges.push_back(ranges[0]);
    vector<int> rangeDiffs;
    for (int i = 1; i < ranges.size(); i++) {
        vector<int> range1 = mergedRanges[mergedRanges.size() - 1];
        vector<int> range2 = ranges[i];

        if (range2[0] <= range1[1]) {
            mergedRanges.pop_back();
            mergedRanges.push_back({range1[0], max(range1[1], range2[1])});
        } else {
            rangeDiffs.push_back(range2[0] - range1[1]);
            mergedRanges.push_back(range2);
        }
    }

    sort(rangeDiffs.begin(), rangeDiffs.end());
    sort(connectors.begin(), connectors.end());

    int result = mergedRanges.size();
    int idx = 0;
    for (int i = 0; i < connectors.size() && idx < rangeDiffs.size(); i++) {
        if (connectors[i] >= rangeDiffs[idx]) {
            idx++;
            result--;
        }
    }

    cout << result;

    return 0;
}

六、华为OD机试真题汇总目录

    【华为OD机试】真题汇总A+B+C+D券(Python实现)

    【华为OD机试】真题汇总A+B+C+D卷(JAVA实现)

    【华为OD机试】真题汇总A+B+C+D卷(C++实现)

标签:真题,connectorStr,OD,ranges,vector,连接器,rangeStr,include
From: https://blog.csdn.net/u014481728/article/details/136970127

相关文章

  • 【华为OD机试】真题A卷-垃圾短信识别(JAVA)
    一、题目描述【华为OD机试】真题A卷-垃圾短信识别(JAVA)题目描述:大众对垃圾短信深恶痛绝,希望能对垃圾短信发送者进行识别,为此,很多软件增加了垃圾短信的识别机制。经分析,发现正常用户的短信通常具备交互性,而垃圾短信往往都是大量单向的短信,按照如下规则进行垃圾短信识别: 本......
  • 【华为OD机试】真题A卷-快速开租建站(Python)
    一、题目描述【华为OD机试】真题A卷-快速开租建站(Python)题目描述:当前IT部门支撑了子公司颗粒化业务,该部门需要实现为子公司快速开租建站的能力,建站是指在一个全新的环境部署一套IT服务。1:每个站点开站会由一系列部署任务项构成,每个任务项部署完成时间都是固定和相等的,设为1......
  • 【华为OD机试】真题A卷-快递业务站(JAVA)
    一、题目描述【华为OD机试】真题A卷-快递业务站(JAVA)题目描述:快递业务范围有N个站点,A站点与B站点可以中转快递,则认为A-B站可达,如果A-B可达,B-C可达,则A-C可达。现在给N个站点编号0、1、…n-1,用s[i][j]表示i-j是否可达,s[i][j]=1表示i-j可达,s[i][j]=0......
  • LeetCode刷题记录——day5
    1、https://leetcode.cn/problems/roman-to-integer/solutions/1/bao-li-po-jie-by-a-studentdog-s1va/?envType=study-plan-v2&envId=top-interview-150关键在于创建字典classSolution{public:intromanToInt(strings){unordered_map<string,int>m=......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • Podman能够替代Docker吗
    导读:参考:ExploringPodman:AMoreSecureDockerAlternative作者:MarinBezhanov网址:https://betterstack.com/community/guides/scaling-docker/podman-vs-docker/该随笔为文章部分摘要和学习笔记架构区别Docker属于CS架构(client-server),Podman利用了无守护架构(daemonless......
  • 2024华为OD统一考试(C卷)最新题库(Java & Python & C++)
    关于华为OD​华为的员工补充途径有三种,分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径,但是从近几届开始竞争非常激烈,尤其是在CV、AI、NLP等赛道上,所以对于C9等专业的学生来说,可以考虑转向一些冷门方向。​OD转正是指在华为工作满一年之后,可以根据部门OD......
  • A Survey on Large Language Model Hallucination via a Creativity Perspective
    本文是LLM系列文章,针对《ASurveyonLargeLanguageModelHallucinationviaaCreativityPerspective》的翻译。从创造力的角度考察大型语言模型的幻觉摘要1引言2LLM时代的幻觉3幻觉中隐藏的创造力4大型语言模型的创造力5利用LLM幻觉进行创造6结论和未......
  • 【LeetCode 552】学生出勤记录II
    题目描述原题链接:LeetCode.552学生出勤记录II解题思路根据题意,缺勤天数最多只有一天,迟到最多只能连续两天,可以按末尾两个字符状态作为DP数组含义的不同维度往后递推长度增长时的数量值。dp[i][j]中的i表示长度为i的出勤记录,j表示末尾字符状态:j的值含义0无......
  • 中国电子学会(CEIT)2021年03月真题C语言软件编程等级考试三级(含详细解析答案)
    中国电子学会(CEIT)考评中心历届真题(含解析答案)C语言软件编程等级考试三级2021年03月编程题五道 总分:100分一、找和为K的两个元素(20分)在一个长度为n(n<1000)的整数序列中,判断是否存在某两个元素之和为k。时间限制:1000ms内存限制:65536kb输入第一行输入......