题意:
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;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!