二分的原理
for(int j=0;j<100;j++)
{
mid=(low+high)/2;
if(find(mid))//判断mid值是比X大还是小
low=mid;
else
high=mid;
}
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int we[100010],va[100010];
double cnt[100010];
int n,k;
int find(double m)
{
for(int i=0;i<n;i++)
{
cnt[i]=1.0*va[i]-we[i]*m;
}
sort(cnt,cnt+n);
double sum=0;
for(int j=0;j<k;j++)
{
sum+=cnt[n-1-j];
}
if(sum>0)
return 1;
else
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d%d",&we[i],&va[i]);
}
double mid,low=0,high=1000000;
for(int j=0;j<100;j++)
{
mid=(low+high)/2;
if(find(mid))
low=mid;
else
high=mid;
}
printf("%.2lf\n",low);
}
return 0;
}