和另一道一样,01分数规划+二分。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double esp=0.00000001;
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        int k;
        int w[101000],v[110000];
         double sum[110000];
        double max1=0;
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
            double l=0.0,r=1000000000.0,mid=0.0;
            for(int i=1;i<=100;i++){//防止double精度造成死循环
                 mid=(l+r)/2.0;
                for(int i=1;i<=n;i++) sum[i]=1.0*v[i]-1.0*mid*w[i];
                sort(sum+1, sum+n+1, greater<double>());
                double total=0.0;
                for(int i=1;i<=k;i++) total+=(1.0*sum[i]);
                if(total>=0.0) l=mid;
                else r=mid;
            }
            printf("%0.2f\n",mid);//注意换行
    }

}