题目描述
飞云现在终于到达了教室,他需要爬n层楼梯,假设他现在处于第x层,正在进行第k次操作,可以做出以下 两种操作之一:
移动到x+k层
移动到x-1层
假设这栋楼无限大(意味着有负无穷和正无穷层),试求到达第 层的最小操作次数。
最开始飞云处在第0层。
输入格式
第一行一个整数 表示测试案例数(1<=t<=1000)
每一个测试案例读入一个整数 表示楼层数。(1<=n<=)
输出格式
输出一行一个正整数表示答案
输入输出样例
样例输入 #1
5
1
2
3
4
5
样例输出 #1
1
3
2
3
4
样例解释
在第一个测试案例,只需要1次,从0跳到1. 在第二个测试案例,至少需要三次。 第一次,从0跳到1. 第二次,从1跳到3 第三次,从3跳到2。
题干分析
将1,2,3,4,5,……依次相加,设和为sum。其中任意一个数可以替换成-1,则n个数的情况下,可以达到的数为1~sum-2(除了sum以外,最大是将1替换为-1,这种情况为sum-2)以及sum,除了这些数以外,都是在当前步数count走不到的。
我们不必考虑怎么走才能到规定楼层,只需要知道要走几层就行
代码
本蒟蒻没有写晦涩难懂的函数,就不解释了QAQ
#include<bits/stdc++.h>
using namespace std;
void f(int x)
{
int k,count=0,sum=0;
cin >> k;
for (int i = 1;; i++)
{
sum += i;
if (sum == k || sum - 2 >= k)
{
count = i;
break;
}
}
cout << count << endl;
return ;
}
int main()
{
int n;
cin>>n;
while (n)
{
f(n--);
}
return 0;
}