POJ2081: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.

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.

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
 
题目意思不难理解就是第m个位置的数是根据第m-1位置的数推出来的如果a[m-1]-m>0,并且a[m-1]-m在前面的序列中没有出现过那么a[m] = a[m-1]-m否则a[m] = a[m-1]+m
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int a[500005]={0};
bool hash[10000000]={false};

int main()
{
    int i;
    for(i = 1;i<= 500000;i++)
    {
        if(a[i-1]-i>0 && !hash[a[i-1]-i])
        a[i] = a[i-1]-i;
        else
        a[i] = a[i-1]+i;
        hash[a[i]] = true;//hash[a[i]] = true,标志为已经出现过
    }
    while(~scanf("%d",&i),i>=0)
    printf("%d\n",a[i]);

    return 0;
}

你可能感兴趣的:(poj,水)