蒟蒻实在太菜了,对本题的理解肤浅,有一个点想不通,希望在座神仙指教。
#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;
}
注:我的主页有很好看的鸡哥。