题意:

N个物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大。

思路:

要使sump/sumw<=x,即使sump-x*sumw<=0,可以二分使该式值为0找解。

代码:

int n,k;
long long sump,sumw;
struct dx
{
    long long w,p;
    double bz;
}a[50010];
bool cmp(dx x,dx y)
{
    return x.bz>y.bz;
}
bool judge(double x)
{
    for(int i=0;i<n;i++)
        a[i].bz=a[i].p-x*a[i].w;
    sort(a,a+n,cmp);
    sump=sumw=0;
    for(int i=0;i<k;i++)
    {
        sump+=a[i].p;
        sumw+=a[i].w;
    }
    if(sump-x*sumw>=0)return true;//往大了找
    return false;
}
int main()
{
    long long ansp,answ;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%lld%lld",&a[i].w,&a[i].p);
    double l=0,r=50010;
    for(int i=0;i<100;i++)
    {
        double m=(l+r)/2;
        if(judge(m))
        {
            ansp=sump;
            answ=sumw;
            l=m;
        }
        else r=m;
    }
    long long gdd=__gcd(ansp,answ);
    ansp/=gdd;
    answ/=gdd;
    printf("%lld/%lld\n",ansp,answ);
    return 0;
}