本文主要是介绍poj 2081【Recaman's Sequence】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
The Recaman's sequence is defined by a0 = 0 ; for m > 0, a m = a m−1 − m if the rsulting a m is positive and not already in the sequence, otherwise a m = a m−1 + m.
The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 ...
Given k, your task is to calculate a k.
The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 ...
Given k, your task is to calculate a k.
Input
The input consists of several test cases. Each line of the input contains an integer k where 0 <= k <= 500000.
The last line contains an integer −1, which should not be processed.
The last line contains an integer −1, which should not be processed.
Output
For each k given in the input, print one line containing a k to the output.
Sample Input
7 10000 -1
Sample Output
20 18658
用一个数组或容器标记数字是否已经存在过。map的话时间有点长,毕竟是树结构。
用数组吧。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define N 500000
using namespace std;
int dp[N];
map<int ,int >a;
void sq()
{dp[0]=0;a[0]++;for(int i=1; i<N; i++){if(dp[i-1]-i>=0&&!a[dp[i-1]-i]){dp[i]=dp[i-1]-i;a[dp[i]]++;}else{dp[i]=dp[i-1]+i;a[dp[i]]++;}}
}
int main()
{int n;sq();while(scanf("%d", &n) && n != -1){printf("%d\n", dp[n]);a.clear();}}
这篇关于poj 2081【Recaman's Sequence】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!