D. Ice Cream Balls(数学题好难不会)

题目链接: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;	

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值