4660: 【GESP2412四级】Recamán数列
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
小样最近发现了有趣的 Recamán 数列,这个数列是这样生成的:
数列的第一项$a_1$ 是$1$ ;
如果$a_{k-1}-k$ 是正整数并且没有在数列中出现过,那么数列的第$k$ 项$a_k$ 为$a_{k-1}-k$ ,否则为$a_{k-1}+k$ 。
小杨想知道 Recamán 数列的前$n$ 项从小到大排序后的结果。手动计算非常困难,小杨希望你能帮他解决这个问题。
数列的第一项$a_1$ 是$1$ ;
如果$a_{k-1}-k$ 是正整数并且没有在数列中出现过,那么数列的第$k$ 项$a_k$ 为$a_{k-1}-k$ ,否则为$a_{k-1}+k$ 。
小杨想知道 Recamán 数列的前$n$ 项从小到大排序后的结果。手动计算非常困难,小杨希望你能帮他解决这个问题。
输入
第一行,一个正整数$n$ 。
输出
一行,$n$ 个空格分隔的整数,表示 Recamán 数列的前$n$ 项从小到大排序后的结果。
样例输入 复制
5
样例输出 复制
1 2 3 6 7
提示
#include <cstdio> #include <algorithm> using namespace std; const int N = 2e5 + 5; const int C = 1e6 + 5; int n; int a[N]; int vis[C]; void bubble_sort(int *a, int n) { bool flag = true; while (flag) { flag = false; for (int i = 1; i < n; ++i) { if (a[i] > a[i + 1]) { flag = true; int t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; } } } } int main() { scanf("%d", &n); a[1] = 1; vis[1] = 1; for (int i = 2; i <= n; i++) { if (a[i - 1] - i <= 0 || vis[a[i - 1] - i]) a[i] = a[i - 1] + i; else a[i] = a[i - 1] - i; vis[a[i]] = 1; } bubble_sort(a, n); for (int i = 1; i <= n; i++) printf("%d%c", a[i], " \n"[i == n]); return 0; }