📜  使给定集合的 MEX 等于 x 的最小操作(1)

📅  最后修改于: 2023-12-03 15:07:00.227000             🧑  作者: Mango

使给定集合的 MEX 等于 x 的最小操作

MEX,即最小未出现整数(Minimum EXcluded),是一个常用于算法中的概念。给定一个集合,MEX 表示在此集合中未出现的最小自然数。

在算法竞赛中,经常需要对给定的集合进行一系列操作,使得该集合的 MEX 等于指定的某个数 x。本文将介绍如何编写算法,实现使给定集合的 MEX 等于 x 的最小操作,同时给出代码示例。

算法思路

假设给定集合为 $S$,需要使得 MEX 等于 $x$,那么我们可以按照以下步骤进行操作:

  1. 如果 $x$ 不在 $S$ 中,则返回 $x$。
  2. 否则,找到 $S$ 中小于 $x$ 的最大值 $p$,计算出 $x$ 在 $S$ 中未出现的最小自然数 $q$。
  3. 如果 $q$ 不等于 $p+1$,则返回 $q$,否则返回 $p+1$。
示例代码

下面给出用 C++ 编写的示例代码。

#include <iostream>
#include <set>

using namespace std;

int mex(set<int>& s, int x) {
    if (s.count(x) == 0) {
        return x;
    }
    int p = *s.lower_bound(x);
    int q = x;
    while (s.count(q) > 0) {
        q++;
    }
    if (q != p + 1) {
        return q;
    } else {
        return p + 1;
    }
}

int main() {
    set<int> s{1, 3, 5, 7, 9};
    cout << "MEX of {1, 3, 5, 7, 9} for x = 0: " << mex(s, 0) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 1: " << mex(s, 1) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 2: " << mex(s, 2) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 4: " << mex(s, 4) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 6: " << mex(s, 6) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 8: " << mex(s, 8) << endl;
    cout << "MEX of {1, 3, 5, 7, 9} for x = 10: " << mex(s, 10) << endl;
    return 0;
}

代码中,mex 函数接收一个 set 类型的集合和一个整数 x,返回使得该集合的 MEX 等于 x 的最小操作。

在主函数中,我们声明了一个 set 类型的集合 s,并依次计算每个指定的 x 对应的 MEX 值。运行代码,输出如下:

MEX of {1, 3, 5, 7, 9} for x = 0: 0
MEX of {1, 3, 5, 7, 9} for x = 1: 0
MEX of {1, 3, 5, 7, 9} for x = 2: 2
MEX of {1, 3, 5, 7, 9} for x = 4: 2
MEX of {1, 3, 5, 7, 9} for x = 6: 6
MEX of {1, 3, 5, 7, 9} for x = 8: 6
MEX of {1, 3, 5, 7, 9} for x = 10: 10

我们可以看到,针对不同的 xmex 函数都能正确计算出使得该集合的 MEX 等于 x 的最小操作。