题目链接:Codeforces Round 894 (Div. 3) D
题目:
特马决定提高自己制作冰淇淋的技能。他已经学会了如何用两个球把冰淇淋做成圆锥形。
在痴迷冰淇淋之前,特马对数学很感兴趣。因此,他很想知道要制作完全n个不同类型的冰淇淋,最少需要个种不同的冰淇淋球。
可能的冰淇淋口味有很多:1,2,3,…特马可以制作任何口味(可能相同)的双球冰淇淋。
如果两个冰淇淋的球口味不同,那么这两个冰淇淋就会被认为是不同的。例如,{1,2}={2,1},但{1,1}≠{1,2}。
例如,有以下冰淇淋球:{1,1,2},特马只能制作两种冰淇淋:{1,1}和{1,2}。
注意,特马不需要同时制作所有的冰淇淋甜筒。这意味着他可以独立制作甜筒冰淇淋。另外,为了给某个x制作一个{x,x}圆锥,特马至少需要2个x类型的球。
请帮助特马回答这个问题。可以证明答案总是存在的。
输入
每个测试由多个测试用例组成。第一行输入包含一个整数 t (1≤t≤104) - 测试用例的数量。然后是测试用例的描述。
每个测试用例的第一行包含一个整数 n (1≤n≤1018) - Tema 想要制作的冰淇淋类型的数量。
输出
对于每个测试用例,输出一个整数 - Tema 需要购买的最小球数。
注
在第一个示例中,有以下球类即可:{1,1}注意,集合 {1} 是不够的,因为我们至少需要 2 个类型为 11 的球才能组成锥形 {1,1}。
在第二个示例中,用2个球是不可能做出锥形的,但是可以用这些球做出:{1,2,3}.
在第三个示例中,{1,2,3,4}是最佳答案,因此我们可以得到以下冰淇淋筒:{1,2}, {1,3}, {1,4}, {2,3},{2,4}, {3,4}.
题解:
// Problem: D. Ice Cream Balls
// Contest: Codeforces - Codeforces Round 894 (Div. 3)
// URL: https://codeforces.com/contest/1862/problem/D
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
bool check(ll x,ll sum){
if(x*(x-1)/2<=sum) return true;
return false;
}
int main(){
int T;
cin>>T;
while(T--){
ll n;
cin>>n;
if(n==1){
cout<<"2\n";
continue;
}
ll l=1,r=2e9;
while(l<r){
int mid=(l+r+1)/2;
if(check(mid,n)){
l=mid;
}
else r=mid-1;
}
cout<<l+(n-(l*(l-1)/2))<<"\n";
}
return 0;
}