ZCMU—2156

2156: J.wjw的跳一跳

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 47   Solved: 18
[ Submit][ Status][ Web Board]

Description

wjw作为一个热爱学习的好同学,经常在寝室学习到深夜,所以他必须边充电边学习。跳一跳就是他最近最喜欢玩的游戏,当然他玩的是跳一跳加强版,规则有一些不一样。一开始wjw会站在X坐标轴原点(0,0)上,第一次跳跃的距离是1,但是之后每一次跳跃的距离都会比上一次跳跃大1个单位。每一次跳跃,会随机向左或向右,而向左的概率会越来越大...于是不甘心的wjw找到了实验室大佬做了一个小外挂...所以现在他可以自主选择往左还是往右跳。
他的朋友圈的最高纪录是(x,0),所以他也想跳到坐标(x,0)上。但是他又想给别人一点面子,所以只能刚好跳到(x,0)上,不能超过别人。现在他很好奇最少要多少次才能到达目标点(x,0)。
当然他在中途超过(x,0)是没有问题的,只要最后能停在(x,0)就可以了。

Input

第一个正整数T,表示数据组数
然后每组数据一个数x,表示目标点

Output

最小步数

Sample Input

12

Sample Output

3

HINT

输入数据保证|x|<=1000000000,T<=5;样例解释:

wjw从0开始

向右跳1到1

向左跳2到-1

向右跳3到2

【分析】

思路题.....如果你一直向右跳能跳到坐标x,那么前面任何一步i选择向左跳就可以到达x-2i,这样就可以证明只要能到达x,就可以到达离x左边距离为偶数的坐标,那么就很简单了...一直向右跳,跳到离重点距离是偶数就是答案了,前面选择某几部向左跳就可以了,反正不要求输出怎么跳...

【代码】
#include<set>
#include<map>
#include<list>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define qread(x) x=read()
#define mes(x,y) memset(x,y,sizeof(x))
#define mpy(x,y) memcpy(x,y,sizeof(x))
#define Maxnb 100000
#define INF 2147483647
inline int read(){
    int f=1,x=0;char ch;
    while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return f*x;
}
int T,x,y;
int main(){
    qread(T);
    while(T--){
        qread(x);
        if(x<0)x=-x;
        y=0;
        for(int i=1;;i++){
            y+=i;
            if(y>=x&&(y-x)%2==0){
                printf("%d\n",i);
                break;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/jnxxhzz/article/details/80691664