题意:
最大化平均值的模型:
有N个物品的重量和价值分别为Wi和Vi,从中选取K个物品使得单位重量的价值最大。也就是使得K个物品的ΣVi /ΣWi最大。
使用二分搜索解决这类问题:
ΣVi /ΣWi >= x也就是Σ(Vi-x*Wi)>=0
去找最大的可行解x即可!X越大,式子左边越小,一直逼到=0的边界!
本题属于这个模型!只不过最后让输出的是选出来的是哪些物品,一样的,对Vi-X*Wi排序的前K个就是所求的物品。
题解:
最大化可行解。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int M,K;
const int INF=1e7+1;
struct node
{
int v,w,id;
double y;
};
struct node a[100000+5];
bool cmp(struct node n1,struct node n2)
{
return n1.y>n2.y;
}
bool C(double x)
{
for(int i=0; i<M; i++)a[i].y=a[i].v-x*a[i].w;
sort(a,a+M,cmp);
double sum=0;
for(int i=0; i<K; i++)
sum+=a[i].y;
return sum>=0;
}
int main()
{
cin>>M>>K;
for(int i=0; i<M; i++)
{ scanf("%d%d",&a[i].v,&a[i].w);
a[i].id=i+1;
}
double lb=0,ub=1.0*INF;
for(int i=1; i<100; i++)
{
double mid=(lb+ub)/2;
if(C(mid))lb=mid;
else ub=mid;
}
for(int i=0;i<K;i++)
printf("%d ",a[i].id);
printf("\n");
}