题解 | 范围内整数的最大得分

题干分析:

依照题意,本题要求我们寻找一个数组中任意两数之间差值的绝对值集合中的最小值的最大值,且数组中的每个元素均可以抬升0~d.

简单来说,就是我们需要尽可能的通过抬升操作,将数组变为各大小差不多的元素间差值尽可能均匀,这样便能够使得集合中最小值取得最大(极端情况下,数组变成等差数列,此时最小值就只有一个,但凡有所偏差均会使最小值更小,导致最小值取不到最大.)

基于以上思想,我们发现这与数组中每个元素的位置无关,且有序能够方便我们的操作,因此首先想到对数组进行排序操作.

排完序后我们思考如何使最小差值尽可能大,已知如果最小差值过大,容易使达到相应值所需抬升的大小过大,因此这在此方面符合单调性,由此我们能够进行二分查找最大分数(最小差值).

算法思路:

我们考虑分数s,如果s符合要求,那么:

只要对于数组除最后一个元素外,满足: x[i + 1] <= x[i] + s <= x[i + 1] + d,且为了尽可能满足,我们让每个符合的值尽可能取最小值,便于让下一个元素达到(此时,两者间差值已经大于分数s,但是无所谓,因为s是最小差值).反之,如果超出范围,则证明s分数不可达.

以上这便是二分的判断逻辑.

至于二分的范围,首先左界是毫无悬念的0,有关右界就是此前分析的如果均匀分布便是最值,因此右界便是((x[n-1] - x[0])/(n - 1) + 1)(加一是为了保证此右界取不到,其实右界你随便设个更大的值甚至INT_MAX应该也能找到,但是为了减少查找次数,所以确定一下右界会更好)

实现代码:

int maxPossibleScore(vector<int>& start, int d) {
        ranges::sort(start);

        auto chack = [&](const int s) -> bool {
            long long x = LLONG_MIN;
            for (const int a : start) {
                x = max(x + s, static_cast<long long>(a)); // 最小满足值(max是因为少说也得比前一个元素大s,但如果当前范围最小值([a,a+d])大于此值,我们只能取a)
                if (x > a + d) return false; // 判断是否超出范围
            }
            return true;
        };
    
        int left = 0, right = (start.back() - start[0] + d) / static_cast<int>(start.size() - 1) + 1;
        while (left + 1 < right) {
            if (const int mid = left + (right - left) / 2; chack(mid)) left = mid;
            else right = mid;
        }
        return left;
    }

复杂度分析:

  • 时间复杂度: 排序O(nlog n), 二分模板O(log n),但是判断函数为时间复杂度为O(n),因此为O(nlog n);总计仍为O(nlog n).
  • 空间复杂度: 排序O(log n)的运行栈空间消耗,其他为常数额外空间,因此总计为O(log n).
全部评论

相关推荐

你是一个2026年毕业生,在2025年这一年里,你经历了日常实习、暑期实习、秋招三个阶段24年12月初-25年3月:日常实习阶段,学校开始放实习了,于是你开始着手准备找日常实习,你去了解就业岗位、编写简历、投递;然后不断碰壁,又重复投递,你没有想到一个个小小的日常实习也如此难找,没有想到实习面试的难度如同正值面试,差点找实习为半而中道崩殂;终于!你在12月初找到了一份公司做产运实习,你直接从海南飞到北京,住在青旅,开启了自己的第一份实习3月你知道了牛客这个app,直接发现了新的天地,原来大家都这么优秀,这么多人早早就知道要准备暑期实习,等秋招,而你只是一个刚刚开始一段实习,感觉学不到东西想要找下一段实习的末2大学生;你告诉自己:“没关系,不焦虑,看到优秀的人更应该向他们学习”,于是你开始了解暑期实习,开始投递,练习笔试用AI模拟面试,并按照大家说的,不断修改自己的简历,终于在5月你拿到了来自美团的暑期实习的offer5月你开始去实习,遇到了好的团队好的mentor,大厂内部的学习资料很多,你上班摸鱼的时候就在刷xuecheng,实习的时候也找到了搭子在北京合租,告别了青旅住宿,感觉北京的生活越来越是你想要的状态,你下定决心一定要留在北京工作生活8月留用流程开始了,没想到收到了转正失败的坏消息...当时打击巨大,你不明白到底哪里出了问题,于是你不得不又开始准备秋招....8月-11月秋招的过程可谓漫长又折磨人,那些简历投递秒挂的企业、点击就送的笔试、永远都不到真人环节的AI面试、....一切的一切都让你感受到无比的焦虑难挨,陷入了对自我的怀疑,对学校的怨恨,不断将自我打碎在重组,终于在11月迎来了自己的秋招offer;得到了offer你发现也没那么开心,人生每个阶段都有新的焦虑,应届生的第一份工作,你害怕选错,你不敢做选择,最终你被时间推着还是做了选择,你告诉自己:选择没那么可怕,要拥有准备”一切重头再来“的勇气。生不逢时,好像是我们这代人的悲哀,虽然生长在一切快速发展的时代,物质和精神甚至都有些过溢了,但竞争压力却与日俱增,在秋招认识的很多人都很优秀,实习+竞赛+项目各种都有,但仍然被秋招重创;究竟是人的问题还是社会的问题?看到这里,希望大家不要内耗不要怀疑自己,虽然这个社会的评价体系很单一,但仍然希望大家可以跳出评价体系,找到属于自己的路,慢点来也没关系的,人生不是0和1,中间还有很多可能性,千万不要把自己陷入死胡同里。
2025年终总结
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务