题意:从零点出发,第i步的步长为i,求走到x的最少的步数。
分析:我一直以为这是道广搜题,计算一下时间复杂度是O(n方),肯定超时。
要最快到达x,每一步都要朝x的方向逼近,当1+2+3+......+n=x时,结果就为n;否则寻找1+2+3+.....+n=y大于x且y-x为偶数的第一个y,则结果为(y-x)/2;画个图应该 大概就明白了。另外大神跟我说可以用tle的算法算小数据(打表)找规律。
代码:
#include<iostream>
using namespace std;
int main()
{
int x;
cin>>x;
x=x<0?-x:x;
int n=0;
while(1){
int s=n*(n+1)/2;
if(s==x) break;
else if(s>x){
if((s-x)%2==0) break;
}
n++;
}
cout<<n<<endl;
}