问题 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,表示目标点
输出
最小步数
样例输入
样例输出
提示
输入数据保证|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;
}