Codeforces Round894.D

题目:D. Ice Cream Balls

题目链接:https://codeforces.com/contest/1862/problem/D

思路:二分找到当所有冰淇淋球类型不同的情况下,假设记位k,满足k*(k-1)/2 <=n ;此时不一定就等于k,所以考虑到有重复类型的冰淇淋球。
当有两个重复类型的球时,可做不同类型的冰淇淋有 k* (k-1)/2+1 ,若有三个及以上重复类型的冰淇淋球则结果仍是加1并且还浪费掉了冰淇淋球所以不满足最小数的条件。

所以,重复类型的冰淇淋球最后仅为 n-k*(k-1)/2;
综上所述,结果为k+n-k*(k-1)/2;

详细代码如下:
点击查看代码

#include <iostream>
#include <climits>
using namespace std;
#define ll long long

void solve(ll n)
{
	ll l = 1, r = INT_MAX,ans=0;// 2147483647
	while (l <= r)
	{
		ll mid = (l + r) >> 1;
		if ((mid * (mid - 1) / 2) > n) r = mid - 1;
		else
		{
			l = mid + 1;
			ans = mid;
		}
	}
	ll result = ans + n - (ans * (ans - 1) / 2);
	cout << result << endl;

}
int main()
{
	ios::sync_with_stdio(false); 
	cin.tie(nullptr);

	int t;
	ll n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		solve(n);

	}

	return 0;
}