zcmu:2156:J.wjw的跳一跳

本文探讨了跳一跳加强版游戏的算法解决方案,通过寻找规律实现从起点(0,0)达到目标点(x,0)所需的最小步数。特别关注了如何利用lower_bound函数定位最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 D: J.wjw的跳一跳

时间限制: 1 Sec   内存限制: 128 MB
提交: 25   解决: 10
[ 提交][ 状态][ 讨论版]

题目描述

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

输入

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

输出

最小步数

样例输入

12

样例输出

3

提示

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

wjw从0开始

向右跳1到1

向左跳2到-1

向右跳3到2


心得:看得我头疼,一看就像是找规律的,找了半天找不到,数组开多少也找了半天,无奈之下开了a[100000],然后做循环直到a[i-1]>1000000000。大概是四万四千多,然后开个45010。至于用lower_bound,主要是很久之前做了一题(给定数组,输入N,找到第一个大于n的数),那时候弄了好几天没弄出来,后来找学长发现他的代码就几行,然后对upper_bound印象深刻,后来搜的时候也看到了lower_bound。就准备拿出来试试。

至于lower_bound和upper_bound的区别:

这里有个详解,主要就是前者是找大于等于的数,后者是找大于的数吧。

点击打开链接

用这个函数的时候忘记返回的是个地址,编译器的error愣是没看出来,搜了一下才发现。

最后就是关于while里面为什么是这个的问题:

在纸上模拟了一下,如果x在(a[c-1],a[c]] 区间,那么x对应的次数一定大于等于c,而且如果(a[c]-x)是偶数就会等于c,所以就是有了下面的while。


#include<bits/stdc++.h>
using namespace std;
int t,x,c;
int a[45010]={0};
void ff(){
    for(int i=1;i<=45000;i++)a[i]=a[i-1]+i;
}
int main(){
    ff();
    scanf("%d",&t);
    while(t--){
        scanf("%d",&x);
        if(x<0)x*=-1;
        c=lower_bound(a,a+45000,x)-a;
        while((a[c]-x)%2)c++;
        printf("%d\n",c);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值