首页 > 其他分享 >华为OD机试-区间叠加

华为OD机试-区间叠加

时间:2023-08-13 20:23:52浏览次数:45  
标签:int ArrayList OD Integer 华为 intervals new 机试 matched

 

 

 

import java.util.ArrayList;
import java.util.TreeMap;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Integer[][] lines = new Integer[5][2];
        lines[0] = new Integer[]{1, 4};
        lines[1] = new Integer[]{2, 5};
        lines[2] = new Integer[]{3, 6};
        lines[3] = new Integer[]{7, 8};
        lines[4] = new Integer[]{10, 39};
        TreeMap<Integer, ArrayList<Integer[]>> intervals = new TreeMap<>();

        // 建立点到线的映射
        for (Integer[] line : lines) {
            IntStream.range(line[0], line[1] + 1).forEach(idx -> {
                ArrayList<Integer[]> ints;
                if (intervals.containsKey(idx)) {
                    ints = intervals.get(idx);
                } else {
                    ints = new ArrayList<>();
                }
                ints.add(line);
                intervals.put(idx, ints);
            });
        }

        int total = 0;
        // 处理分段线段
        while (!intervals.isEmpty()) {
            ArrayList<Integer> matched = new ArrayList<>();
            total += retrieve(intervals.firstKey(), intervals, matched, 0);
            if (matched.isEmpty()) {
                break;
            } else {
                int maxIdx = matched.stream().mapToInt(Integer::intValue).max().orElse(-1);
                int maxRightIdx = intervals.get(maxIdx).stream().mapToInt(value -> value[1]).max().orElse(-1);
                for (int i = intervals.firstKey(); i <= maxRightIdx; i++) {
                    intervals.remove(i);
                }
            }
        }
        System.out.println(total);
    }

    // 下级线段判断
    private static int retrieve(Integer entryKey, TreeMap<Integer, ArrayList<Integer[]>> intervals, ArrayList<Integer> matched, int totalLine) {
        ArrayList<Integer[]> integers = intervals.get(entryKey);
        int nextOffset = integers.stream().mapToInt(position -> position[1] - entryKey).max().orElse(-1);
        int nextKey = entryKey + nextOffset;
        if (nextOffset != 0 && intervals.containsKey(nextKey)) {
            matched.add(entryKey);
            return retrieve(nextKey, intervals, matched, totalLine) + 1;
        } else {
            return totalLine;
        }
    }
}

 

标签:int,ArrayList,OD,Integer,华为,intervals,new,机试,matched
From: https://www.cnblogs.com/kitor/p/17627190.html

相关文章

  • 【题解】Educational Codeforces Round 146(CF1814)
    而且怎么感觉E,F比D要简单很多,大概是因为比较套路吧[惊恐]A.Coins题目描述:本题一共有\(t\)组数据。每组数据包含两个整数\(n\)和\(k\),如果存在两个非负整数\(x,y\),满足\(2\timesx+k\timesy=n\),输出YES,否则输出NO(yes,Yes,NO,nO均可)。题目分析:注意到\(y\)可......
  • Codeforces Round 892 (Div. 2)(vp)
    CodeforcesRound892(Div.2)AUnitedWeStand题意:给一个数组,让你把它分成两个数组,第二个数组里的数不能是第一个数组里的数的除数,先输出两个数组的长度,依次输出两个数组的数,如果无法分出来,输出-1思路:如果数的种类只有一种一定不行,反之一定行,对于可行的情况,我们把最大的......
  • Learning Transferable Visual Models From Natural Language Supervision
    LearningTransferableVisualModelsFromNaturalLanguageSupervision作者:AlecRadford*1JongWookKim*1ChrisHallacy1AdityaRamesh1GabrielGoh1SandhiniAgarwal1GirishSastry1AmandaAskell1PamelaMishkin1JackClark1GretchenKrueger1Ily......
  • 打造 VSCode 高效 C++ 开发环境的必备插件
    工欲善其事,必先利其器C++clangd:代码补全、跳转、clang-tidy检查,自带clang-formatCodeLLDB:LLVM的调试器(类比GDB)CMakeCMakeTools文档DoxygenDocumentationGenerator:自动生成doxygen注释PlantUML:Alt+D直接预览plantumlMarkdownPanguMarkdown:自动在中英文......
  • LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • VSCode C++开发环境配置:CMake 调试配置 launch.json
    相关内容VSCodeC++开发环境配置:LLVMclangclangd安装cmakesudoaptinstallcmake安装VSCode插件CMakeCMakeTools编写CMakeLists.txtproject(hello)cmake_minimum_required(VERSION3.15.0)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_EXTENSIONSOFF)add......
  • LeetCode 322.零钱兑换
    1.题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。 https://leetcode.cn/problems/coin-change/示......
  • Codeforces Round 892 (Div. 2)
    手速慢了,掉分C.AnotherPermutationProblemProblem-C-Codeforces题意给定一个正整数\(n\),设序列\(p\)为\(n\)的排列,求\(\sum_{i=1}^{n}p_i\timesi-max_{j=1}^np_j\timesj\)的最大值。思路打表可知,答案的排列一定为翻转一部分后缀。暴力枚举要翻转的后缀即可。代码......
  • AtCoder Beginner Contest 314 A - Ex题解
    AtCoderBeginnerContest314A-3.14嗯,你可以用string存小数点后的...B-Roulette对于每一个金额,用个vector存pair<>存一个人赌了多少,以及是哪一个人。C-RotateColoredSubsequence每种数用个双向链表记下来。D-LOWER我们观察到,对于2,3操作,只有最后一次有用,且......
  • Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
    UnityAssetPostprocessor的Model的动画相关的函数修改实际应用在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使......