题解 | mex

mex

https://www.nowcoder.com/practice/da138098ed74405db63e0d75a9878acc?tpId=385&tqId=11160666&channelPut=tracker1

这道题目是一道典型的博弈/构造类贪心题,核心在于理解 mex(最小未出现的非负整数)对数组变化的实质影响。

核心思路分析

我们需要通过操作 ai = max(0, ai - mex)让数组中所有元素相等。

情况 A:数组元素已经全部相同

  • 此时不需要任何操作,直接输出 0。

情况 B:数组元素不全相同,且数组中没有 0

  • 如果数组中没有 0,那么当前的 mex 必然等于 0。
  • 执行操作:。
  • 这意味着数组永远不会发生变化。既然初始时不相同,操作后也不变,则永远无法相同。
  • 输出 -1。

情况 C:数组元素不全相同,且数组中有 0

这是本题的核心。当数组中有 0 时,mex > 0,数组必将逐渐向 0 靠拢,也就是目标要将所有元素变为 0 。

  • 规律观察:
  • ① 若数组为连续无空缺,此时 。操作一次后,所有数减去 mex 并与 0 取大,全部变为 0。只需 1 轮。
  • ② 若数组有空缺(即某些数字没出现),例如 :若数组为 :{0,3}。第一轮:mex=1,数组变为{0,2} ;第二轮:mex=1,数组变为 {0,1}连续无空缺的序列;第三轮:mex=2,数组操作一次变为{0,0} 。共 3 轮。
  • 总结公式:设数组中的最大值为 max_val,去重后的元素个数为 s.size()。每一个“缺失”的数字都会导致需要额外的一轮操作来让较大的数“滑”下来填补空位。最终需要的轮数公式为:rounds = max_val - (s.size()-1) + 1= max_val - s.size() + 2
  • 对于rounds公式的解读:max_val - (s.size()-1)就是填补空位所需要的轮数,也就是空位的数量,最后+1是因为此时空位已被较大数给填满,序列已经变得有序,回到情况C的①状态,这个时候只需要一轮就能将所有数变成 0。
#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    set<long long>a; // 既能去除没有意义的重复数,又能对s进行升序排序
    long long temp;
    for (int i = 1; i <= n; i++) {
        cin >> temp;
        a.insert(temp);
    }
    if (a.size() == 1) {
        cout << 0;
    } else if (a.count(0) == 0) {
        cout << -1;
    } else { // 当满足一般情况时,
        long long max_val = *a.rbegin();
        long long r_count = a.size();

        long long ans = max_val - r_count + 2;
        cout << ans;
    }
}

全部评论

相关推荐

02-16 01:39
南昌大学 Java
重剑Ds:感觉不太可能 后端都减飞了 根本不缺人
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11099次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1960次浏览 42人参与
# 米连集团26产品管培生项目 #
6042次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7644次浏览 43人参与
# 简历第一个项目做什么 #
31750次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433557次浏览 3926人参与
# MiniMax求职进展汇总 #
24122次浏览 309人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187217次浏览 1122人参与
# 牛客AI文生图 #
21452次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152461次浏览 888人参与
# 研究所笔面经互助 #
118967次浏览 577人参与
# 简历中的项目经历要怎么写? #
310376次浏览 4219人参与
# AI时代,哪些岗位最容易被淘汰 #
63853次浏览 828人参与
# 面试紧张时你会有什么表现? #
30516次浏览 188人参与
# 你今年的平均薪资是多少? #
213147次浏览 1039人参与
# 你怎么看待AI面试 #
180154次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64334次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76547次浏览 374人参与
# 我的求职精神状态 #
448145次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363525次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160683次浏览 1112人参与
# 校招笔试 #
471238次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务