自学内容网 自学内容网

GESP202412 四级【Recamán】题解(AC)

在这里插入图片描述
》》》点我查看「视频」详解》》》

[GESP202412 四级] Recamán

题目描述

小杨最近发现了有趣的 Recamán 数列,这个数列是这样生成的:

  • 数列的第一项 a 1 a_1 a1 1 1 1
  • 如果 a k − 1 − k a_{k-1}-k ak1k 是正整数并且没有在数列中出现过,那么数列的第 k k k a k a_k ak a k − 1 − k a_{k-1}-k ak1k,否则为 a k − 1 + k a_{k-1}+k ak1+k

小杨想知道 Recamán 数列的前 n n n 项从小到大排序后的结果。手动计算非常困难,小杨希望你能帮他解决这个问题。

输入格式

第一行,一个正整数 n n n

输出格式

一行, n n n 个空格分隔的整数,表示 Recamán 数列的前 n n n 项从小到大排序后的结果。

样例 #1

样例输入 #1

5

样例输出 #1

1 2 3 6 7

样例 #2

样例输入 #2

8

样例输出 #2

1 2 3 6 7 12 13 20

提示

样例解释

对于样例 1, n = 5 n=5 n=5

  • a 1 = 1 a_1=1 a1=1
  • a 1 − 2 = − 1 a_1-2=-1 a12=1,不是正整数,因此 a 2 = a 1 + 2 = 3 a_2=a_1+2=3 a2=a1+2=3
  • a 2 − 3 = 0 a_2-3=0 a23=0,不是正整数,因此 a 3 = a 2 + 3 = 6 a_3=a_2+3=6 a3=a2+3=6
  • a 3 − 4 = 2 a_3-4=2 a34=2,是正整数,且没有在数列中出现过,因此 a 4 = a 3 − 4 = 2 a_4=a_3-4=2 a4=a34=2
  • a 4 − 5 = − 3 a_4-5=-3 a45=3,不是正整数,因此 a 5 = a 4 + 5 = 7 a_5=a_4+5=7 a5=a4+5=7

a 1 , a 2 , a 3 , a 4 , a 5 a_1,a_2,a_3,a_4,a_5 a1,a2,a3,a4,a5 从小到大排序的结果为 1 , 2 , 3 , 6 , 7 1,2,3,6,7 1,2,3,6,7

数据范围

对于所有数据点,保证 1 ≤ n ≤ 3   000 1\le n\le 3\, 000 1n3000

AC_Code

#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
int w[N];


int main()
{
    int n;
    cin >> n;
    w[1] = 1;
    set<int> s;
    s.insert(1);
    for(int i = 2; i <= n; i ++)
    {
        int x = w[i - 1] - i;
        if(x > 0 && s.find(x) == s.end()) w[i] = x;
        else w[i] = w[i - 1] + i;

        s.insert(w[i]);
    }

    sort(w + 1, w + n + 1);

    for(int i = 1; i <= n; i ++)
        cout << w[i] << " ";
    return 0;
}

》》》点我查看「视频」详解》》》


原文地址:https://blog.csdn.net/m0_65641514/article/details/144460749

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!