跳跳虎の跃·题解
2023-08-15 19:53:15
发布于:浙江
3阅读
0回复
0点赞
思路:
我们需要考虑如何跳跃来达到目标位置,可以发现每次跳跃后的步长是递增的,即 。这意味着在第n次跳跃后,我们可以达到从1
到n
的所有连续整数之和。
解题的关键在于找到合适的步数,使得连续整数之和恰好大于等于目标位置x。我们可以使用等差数列的求和公式来表示连续整数之和 。
- 首先,我们考虑目标位置
x
的绝对值,因为步长始终为正。所以,我们计算绝对值后的x
。 - 我们从步数n为1开始逐步增加,计算 的值,直到这个值大于等于
x
的绝对值为止。这个步数n就是最小的跳跃次数。 - 如果 正好等于x的绝对值,那么跳跃次数就是
n
。 - 如果 大于
x
的绝对值,我们需要检查差值是否为偶数。如果是,那么我们可以通过调整一个步长来减小差值。所以,我们在步数n
上不断增加,直到 为偶数。 - 此时,我们得到了最小的跳跃次数n,但是需要根据目标位置的正负来确定跳跃的方向。如果目标位置
x
大于等于0
,则直接输出n。如果目标位置x
小于0
,则由于我们可以向左或向右跳,需要额外判断是否需要多跳一次以达到目标位置。
代码:
#include<bits/stdc++.h>
using namespace std;
int f(int x){
int n=1;
while(n*(n+1)/2<abs(x)) n++; 不断接近答案
if(n*(n+1)/2==x) return n; 如果跳跃次数正好为n,则返回
else{
while((n*(n+1)/2-x)%2!=0) n++; 根据差值的奇偶性调整跳跃次数
return n;
}
return n;
}
int t,x;
int main(){
cin>>t;
while(t--){
cin>>x;
if(x!=0) cout<<f(x)<<endl; 特判0,否则会错4个点
else cout<<0<<endl;
}
return 0;
}
全部评论 2
真的有实力%%%
2023-08-15 来自 四川
0%%%
2023-08-15 来自 四川
0%%%
2023-08-15 来自 浙江
0
有帮助,赞一个