列表

详情


NC204434. 完全图

描述

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

输入描述

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

输出描述

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

示例1

输入:

2
5 1
5 5

输出:

1
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 51ms, 内存消耗: 504K, 提交时间: 2020-03-22 15:44:45

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int t;cin>>t;
	while(t--){
		ll n,m;cin>>n>>m;
		ll l=0,r=n-1;
		while(l<r){
			ll mid=(l+r+1)>>1;
			if(2*n-mid-1<=2*m/mid) l=mid;
			else r=mid-1;
		}
		cout<<l+1<<"\n";
	}
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 197ms, 内存消耗: 24412K, 提交时间: 2020-03-22 18:24:09

T = int(input())
for tim in range(T):
  n,m = [int(x) for x in input().split()]
  temp=max(0,n*(n-1)//2-m)
  l,r=0,n-1
  while l<r:
    mid=l+r>>1
    if (mid*(mid+1)>>1)>=temp:
      r=mid
    else:
      l=mid+1
  print(n-l)

Python3(3.5.2) 解法, 执行用时: 819ms, 内存消耗: 3416K, 提交时间: 2020-03-21 21:06:22

T=int(input())
for i in range(1,T+1):
	n,m=map(int,input().split())
	l,r=0,n
	for j in range(130):
		mid=(l+r)//2
		if mid*n-mid*(mid+1)//2>m:
			r=mid
		else:
			#print(mid)
			l=mid
	print(l+1)

上一题