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