A. Recaman’s Sequence
Time Limit: 3.0 Seconds Memory Limit: 65536K
The Recaman’s sequence is defined by a0 = 0 ; for m > 0, am = am-1 - m if the resulting am is positive and not already in the sequence, otherwise am = am-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 ak.
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 ak to the output.
Sample Input
7
10000
-1
Sample Output
20
18658
//这个提交超时了
#include<iostream>
#include<set>
using namespace std;
int main(){
int k;
int ans=0;
set <int> s;
while((cin>>k)&&k!=-1){
ans=0;
s.clear();
int temp;
s.insert(0);
for(int i=1;i<=k;i++){
temp=ans-i;
set <int>::iterator itr=s.find(temp);
if(temp<0||itr != s.end())
temp=ans+i;
s.insert(temp);
ans=temp;
}
cout<<ans<<endl;
}
return 0;
}
看了一下数据量不是很大,改了一下程序,直接把500000以内的序列全部算出来存在数组里,然后直接从数组里调用。程序如下:
#include<iostream>
#include<set>
using namespace std;
set <int> s;
int a[500005];
int main(){
int k;
int ans=0;
int temp;
s.insert(0);
a[0]=0;
for(int i=1;i<=500001;i++){
temp=ans-i;
set <int>::iterator itr=s.find(temp);
if(temp<0||itr != s.end())
temp=ans+i;
s.insert(temp);
ans=temp;
a[i]=ans;
}
while((cin>>k)&&k!=-1)
cout<<a[k]<<endl;
return 0;
}