1 条题解

  • 0
    @ 2025-9-6 13:38:22

    C++ :

    #include <iostream>
    #include <vector>
    #include <unordered_set>
    #include <algorithm>
     
    using namespace std;
     
    int main() {
        int n;
        cin >> n;
        vector<int> A(n + 1);      // 存储Recamán序列(索引1~n)
        unordered_set<int> exist;   // 快速判断数字是否已存在
     
        A[1] = 1;                   // 初始化第一个项
        exist.insert(1);            // 记录初始值
     
        for (int k = 2; k <= n; k++) {
            int candidate = A[k - 1] - k;  // 计算候选值aₖ₋₁ -k
            // 判断候选值是否合法且未存在
            if (candidate > 0 && !exist.count(candidate)) {
                A[k] = candidate;
            } else {
                A[k] = A[k - 1] + k;       // 候选值不合法时取aₖ₋₁ +k
            }
            exist.insert(A[k]);     // 将新项加入集合
        }
     
        // 拷贝前n项并排序
        vector<int> sorted_A(A.begin() + 1, A.begin() + n + 1);
        sort(sorted_A.begin(), sorted_A.end());
     
        // 输出排序结果
        for (int num : sorted_A) {
            cout << num << " ";
        }
     
        return 0;
    }
    
    • 1

    信息

    ID
    5524
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者