题目链接 点击打开链接
首先正负数的结果是一样的。这道题可以先打表,把等差数列前n项和求出,用lower bound找到最小的pos,使得a[pos]大于输入的数。因为等差数列有的项要变为负数,所以一反一正,减小了“ 2*某一个数”,所以如果pos为所求,充要条件是 (a[pos]-t)%2==0。若不满足,pos++即可~~~
做这题WA了好几发,思路没问题,原因是a数组开的太大,结果我又脑残用了int,到后来直接溢出了……
还有一个问题 输出两个换行。。。而且最后一个数据不要输出两个换行。。。
AC代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
using namespace std;
int a[50005];
int main()
{
int i,j;
a[1]=1;
for(i=2;i<=50003;i++)
{
a[i]=i+a[i-1];
}
int n;
cin>>n;
for(i=0;i<n;i++)
{
int t;
cin>>t;
t=abs(t);
int pos=lower_bound(a+1,a+50000,t)-a;
int cha;
while(true)
{
cha=a[pos]-t;
if(cha%2==0)
{
cout<<pos<<endl;
break;
}
else pos++;
}
if(i!=n-1)cout<<endl;
}
return 0;
}