题意分析:
Time Limit | Memory Limit |
---|
3000MS | 60000K |
- Description:
Recaman的序列由a0 = 0定义; 对于m> 0,如果结果am为正且尚未在序列中,则am = am-1-m,否则am = am-1 + m。
Recaman序列中的前几个数字是0、1、3、6、2、7、13、20、12、21、11、22、10、23、9 …
给定k,您的任务是计算ak - Input:
输入包含几个测试用例。 输入的每一行都包含一个整数k,其中0 <= k <= 500000。
最后一行包含一个整数-1,不应对其进行处理。 - output:
对于输入中给定的每个k,在输出中打印包含ak的一行。 - 分析:
根据数据的输入要求,小于5e5,我们分析一下时间是足够模拟的,所以直接模拟做即可。
解题代码:
#include<iostream>
using namespace std;
#include<map>
int a[500001]={0};
int main()
{
map<int,int>Map;
map<int,int>::iterator it;
for(int i=1;i<5e5+1;i++)
{
if(a[i-1]-i>0)
{
it=Map.find(a[i-1]-i);
if(it==Map.end())
a[i]=a[i-1]-i;
else
a[i]=a[i-1]+i;
}
else
a[i]=a[i-1]+i;
Map.insert(pair<int,int>(a[i-1],1));
}
int k;
while(cin>>k&&k!=-1)
{
cout<<a[k]<<endl;
}
return 0;
}