//这样的题很容易超时,所以就开两个数组,一个保存结果,一个保存已经出现过的结果,这样就容易判断了,
//如果再倒过来判断是否出现在字符串出现,就超时了!
/*#include "iostream"
#include "memory.h"
using namespace std;
int a[500005];
bool flag[20000000];
int main()
{
int i, j, temp1, temp2;
memset(a, 0, sizeof(a));
memset(flag, false, sizeof(flag));
for (i = 1; i <= 500000; i++)
{
temp1 = a[i-1]-i;
temp2 = a[i-1]+i;
if (temp1 > 0 && flag[temp1] == false)
{
a[i] = temp1;
flag[temp1] = true;
}
else
{
a[i] = temp2;
flag[temp2] = true;
}
}
int num;
while (cin >> num && num != -1)
{
cout << a[num] << endl;
}
system("pause");
}
*/
//下面是用set保存已经出现过的结果,时间远远大于上面的做法!
#include "iostream"
#include "set"
#include "memory.h"
using namespace std;
int a[500005];
set<int> s;
int main()
{
int i, temp;
memset(a, 0, sizeof(a));
s.insert(a[0]);
for (i = 1; i <= 500000; i++)
{
temp = a[i-1]-i;
if (temp > 0 && s.find(temp) == s.end())
{
a[i] = a[i-1]-i;
s.insert(a[i]);
}
else
{
a[i] = a[i-1]+i;
s.insert(a[i]);
}
}
int num;
while (cin >> num && num != -1)
cout << a[num] << endl;
}
10-10
10-10