题目链接:
http://codeforces.com/problemset/problem/11/B
题目大意:
一个人在x轴上走,他要到达点x,他第一次只能走一步,以后的每一次都要比上一次步数大1,问要走多少次才能到达点x。
题目解析:
这道题关键找到规律,一旦找到解题是很快的。对于负数,我们可以取绝对值,因为正负是等效的。首先,我们想想,如果我们能朝着一个方向一直走,刚好能到达点x,这样是最好的,走的次数也是最小的。但如果不能,我们势必会超过点x,这时我们记超过的这点为y。如果(y - x)为偶数,那么就要在第(y - x)/ 2次时 朝回走,为什么呢? 因为我们超过的步数为偶数,就需要把这多出的步数抵消掉。我们知道,一个人往回走2步,再往前走2步,他的位置是不变的,但他多走了4步。如果我们把多出的步数一半的先往回走,再往前走,是不是就抵消掉了。因为每次步数要加1,所以应该在(y - x)/ 2次时往回走,这样就能到达点x。那如果超出的步数是奇数呢?只要再走一次变成偶数就行了。
参考代码:
1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 int main(){ 6 ll x; 7 ll res, now; 8 while(cin>>x){ 9 res = now = 0; 10 if (x < 0) x = -x; 11 while(now < x || (now - x) % 2) { 12 ++res; 13 now += res; 14 } 15 cout<<res<<endl; 16 } 17 }
原文:http://www.cnblogs.com/garden6zg/p/7753111.html