牛客小白月赛23 完全图(二分查找)

链接:https://ac.nowcoder.com/acm/contest/4784/C

题目描述

在图论的数学领域,完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。————百度百科
现在给定一个包含 {n}n 个顶点的完全图,你可以删掉图中的一些边,但是删掉的边不能超过 {m}m 条,请问删去边之后的图最多能有几个连通分量?

输入描述:

第一行包含一个数字 {T}T,表示测试数据组数
接下来 {T}T 行,每行两个正整数{n}n,{m}m,中间用空格隔开

输出描述:

输出 {T}T 行,每行一个整数表示答案

示例1

输入
2
5 1
5 5
输出
复制
1
2

思路:

n个顶点的完全图若要+1连通分量,至少删除n-1条边,此操作后剩下n-1个顶点的完全图,需要再删n-2条边,以此类推,我们可以知道n个顶点的完全图若有x个连通分量,需要至少删除以n-1为首项,公差为-1的等差数列的 Sx-1。因此我们可以二分找到答案。需要注意n*x会很大,会刚好爆long long,可用long double。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double lb;
const ll maxn=1e18+18;

lb n,m;
bool check(lb x)
{
    
    
		if(n*x-(x+1)*x/2>m)
		return true;
		return false;
	
}
int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		cin>>n>>m;
		ll l=0,r=n-1,ans;
		ll mid;
		while(l<=r)
		{
    
    
			mid=(l+r)/2;
			if(check(mid))
			{
    
    
				r=mid-1;
			}
			else
			l=mid+1;
		}
		cout<<l<<endl;
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/xiaolan7777777/article/details/105542509