奇怪的二分判断求助
查看原帖
奇怪的二分判断求助
221023
LuomuQDM楼主2022/7/16 15:12

蒟蒻实在太菜了,对本题的理解肤浅,有一个点想不通,希望在座神仙指教。

#include<bits/stdc++.h>
#define ll long long
#define minx 0.001
#define maxn 100000
using namespace std;
ll n,k;
double a[maxn+1],c[maxn+1];
double l=1,r,mid,x[maxn+1],y[maxn+1];
bool cmp(double a,double b){
	return a<b;
}
bool check(double t){
	ll sum=0,j=0;
	for(int i=1;i<=n;i++){
		x[i]=1.0*a[i]*(c[i]-t);
		y[i]=1.0*a[i]*(t-c[i]);
		if(x[i]+minx>y[i])sum--;
	}
	sort(x+1,x+n+1,cmp);
	sort(y+1,y+n+1,cmp);
	for(int i=1;i<=n;i++){
		while(x[i]+minx>y[j+1]&&j<n)j++;
		sum+=j;
	}
	if(sum/2<k)return 1;//就是这个地方sum为什么要除以2啊
	return 0;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>c[i];
		r=max(r,c[i]);
	}
	while(l+minx<r){
		mid=(l+r)/2;
		if(check(mid)){
			r=mid;
		}else l=mid;
	}
	printf("%.3f\n",l);
	return 0;
}

注:我的主页有很好看的鸡哥。

2022/7/16 15:12
加载中...