链接 https://codeforces.com/contest/1455/problem/B
You are standing on the OX-axis at point 0 and you want to move to an integer point x>0.
You can make several jumps. Suppose you’re currently at point y (y may be negative) and jump for the k-th time. You can:
either jump to the point y+k
or jump to the point y−1.
What is the minimum number of jumps you need to reach the point x?
Input
The first line contains a single integer t (1≤t≤1000) — the number of test cases.
The first and only line of each test case contains the single integer x (1≤x≤106) — the destination point.
Output
For each test case, print the single integer — the minimum number of jumps to reach x. It can be proved that we can reach any integer point x.
Example
input
5
1
2
3
4
5
output
1
3
2
3
4
Note
In the first test case x=1, so you need only one jump: the 1-st jump from 0 to 0+1=1.
In the second test case x=2. You need at least three jumps:
the 1-st jump from 0 to 0+1=1;
the 2-nd jump from 1 to 1+2=3;
the 3-rd jump from 3 to 3−1=2;
Two jumps are not enough because these are the only possible variants:
the 1-st jump as −1 and the 2-nd one as −1 — you’ll reach 0−1−1=−2;
the 1-st jump as −1 and the 2-nd one as +2 — you’ll reach 0−1+2=1;
the 1-st jump as +1 and the 2-nd one as −1 — you’ll reach 0+1−1=0;
the 1-st jump as +1 and the 2-nd one as +2 — you’ll reach 0+1+2=3;
In the third test case, you need two jumps: the 1-st one as +1 and the 2-nd one as +2, so 0+1+2=3.
In the fourth test case, you need three jumps: the 1-st one as −1, the 2-nd one as +2 and the 3-rd one as +3, so 0−1+2+3=4.
题意
我们能对一个数进行两种操作:
第一种是在第i次操作减一
第二种是在第i次操作加i
现在给你一个数,求最少操作次数能到这个数?
思路
思维题,我们看样例发现
求在1+2+3+…+n哪个区间内,输出i值即可,如果这个数是这个数列和减一的话,则我们要加一次操作,观察可推出。
比如说
1 + 2 + 3 + 4 = 10
9的话只能1 + 2 + 3 + 4 - 1可得,其他区间内的数都能改变其中项为-1实现。
代码
#include <bits/stdc++.h>
typedef long long ll;
const ll mod = 1e9+7;
using namespace std;
namespace fastIO {
inline ll qpow(ll a, ll b) {
ll ans = 1, base = a;
while (b) {
if (b & 1) ans = (ans * base % mod +mod )%mod;
base = (base * base % mod + mod)%mod;
b >>= 1;
}
return ans;
}
}
using namespace fastIO;
const int N = 2e6 + 5;
int Case,n;
int f[N];
int cnt;
void init(){
for(int i=0;i<=N;i++){
int t=(i*i+i)/2;
if(t>N) break;
f[cnt++]=t;
}
}
int main(){
Case=1;
init();
scanf("%d",&Case);
while(Case--){
scanf("%d",&n);
int vis;
for(int i=1;i<=cnt;i++){
if(f[i]>=n){
vis = i;
break;
}
}
if(f[vis]-1==n) printf("%d\n",vis+1);
else printf("%d\n",vis);
}
return 0;
}