首先可以想到对于1,3,6,10…(三角形数)这些数直接向前跳就是最优解,那么根据这些数将其他数分隔,可以大致找到规律,
1 1 1
2 1+2-1 3
3 1+2 2
4 -1+2+3 3
5 1+2+3-1 4
6 1+2+3 3
7 1-1+3+4 4
8 -1+2+3+4 4
9 1+2+3+4-1 5
10 1+2+3+4 4
如果n是第x个三角形数,那么n-1的最优解是x+1,除此以外第x-1到第x个三角形数中间的数最优解都是x,
那么只需要按这个规律预处理一下1-1e6中的每个数的最优解,对于每个查询输出即可
#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define endl '\n'
#define ps puts("###")
#define int long long
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int MAXN = 2e6+10;
const double EPS = 1e-12;
const ll mod = 1e9+7;
int T;
int vis[MAXN];
int ans[MAXN];
int n;
init(){
int sum = 0;
for(int i = 1; i <= 2000; i++){
sum+=i;
vis[sum] = 1;
if(sum>=1e6){
break;
}
}
int cnt = 1;
for(int i = 1; i <= 1000000; i++){
if(vis[i]==1){
ans[i] = cnt;
ans[i-1]++;
cnt++;
}
else{
ans[i] = cnt;
}
}
}
signed main()
{ init();
//cout<<endl;
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>T;
int cnt = 0;
while(T--){
cin>>n;
cout<<ans[n]<<endl;
}
}