最大化平均值
///4.最大化平均值 /** Q:有n个价值和重量为vi、wi的物品,从中挑选k个使单位重量的价值最大 A: 此题不能直接用贪心法:直接按物品的单位价值排序,然后依次取k个; 我们要求的最大值是,价值之和/重量之和;而上面所说是单位价值之和。 ------------------------------------------变形贪心 二分搜索法模型: 条件C(x):可以挑选使得单位重量的物品价值不小于x->求满足条件的最大x->如何判断C(x) 价值和/重量和>=x 价值和-重量和*x>=0 和(价值-重量*x)>=0 可以对(价值-重量*x)的值进行贪心的选取,选取最大的k个 和>=0 */ #include "iostream" #include "cstdio" #include "algorithm" using namespace std; #define MAX 100010 #define INF 0x3f3f3f3f int N,K; int w[MAX],v[MAX]; double y[MAX]; bool C(double x) { for(int i=0;i<N;i++) y[i]=v[i]-w[i]*x; sort(y,y+N); ///取k个 int t=N-1-K; double sum=0; for(int i=N-1;i>t;i--) { sum+=y[i]; } return sum>=0; } void solve() { double lb=0,ub=INF,mid; for(int i=0;i<100;i++) { mid=(lb+ub)/2; if(C(mid)) lb=mid; else ub=mid; } printf("%.2f\n",ub); } int main() { while(~scanf("%d%d",&N,&K)) { for(int i=0;i<N;i++) scanf("%d%d",&w[i],&v[i]); solve(); } return 0; } /** 3 2 2 2 5 3 2 1 0.75 */