二分+求和公式(这个题的精度错了无数次)
以五个顶点的完全图为例
删去四个边(共删4个),形成两个连通图-->再删去三个边(共删4+3),形成三个完全图-->再删去两个边(共删4+3+2),形成四个完全图-->再删去一个边(共删4+3+2+1),形成五个完全图。
因此,只要判断区间就可以。
五个顶点的完全图共有5个区间。(使用两分法查找)
每个区间对应的范围可以推导出来:
0:0
1:0+4
2:0+4+(4-1)
3:0+4+(4-1)+(4-2)
4:0+4+(4-1)+(4-2)+(4-1)-->(5-1)*4-4*(3)/2
所以通过上式,可以推导出公式为
,化简一下:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<climits>
using namespace std;
typedef long long ll;
long double n,m;
long double check(ll mid){//求和公式
return (n-1-mid+n)*mid/2.0;
}
int main(){
ll t;
cin>>t;
while(t--){
cin>>n>>m;
ll left=0,right=n-1;
while(left<=right){
ll mid=(left+right)/2;
if(check(mid)>m){
right=mid-1;
}else{
left=mid+1;
}
}
cout<<left<<endl;
}
return 0;
}

全部评论
(1) 回帖