最大化平均值 (二分查找)
有n个物品的重量和价值分别是wi和vi。从中选出k个物品使得单位重量的价值最大。 1<=k<=n<=10^4 1<=wi,vi<=10^6
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include<stdlib.h> 9 #include<map> 10 #include<stack> 11 #include<queue> 12 #include<vector> 13 using namespace std; 14 #define clr(x,y) memset(x,y,sizeof(x)) 15 #define sqr(x) ((x)*(x)) 16 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 17 #define LL long long 18 #define INF 0x3f3f3f3f 19 #define A first 20 #define B second 21 const int N=1e4+131; 22 int n,k; 23 double w[N],v[N],y[N]; 24 25 bool check(double x) 26 { 27 for(int i=0;i<n;i++) { 28 y[i]=v[i]-x*w[i]; 29 } 30 sort(y,y+n); 31 32 double sum=0; 33 for(int i=0;i<k;i++) { 34 sum+=y[n-i-1]; 35 } 36 37 return sum>=0; 38 } 39 40 void solve() 41 { 42 scanf("%d%d",&n,&k); 43 for(int i=0;i<n;i++) { 44 scanf("%lf%lf",&w[i],&v[i]); 45 } 46 47 double lb=0,ub=INF; 48 49 for(int i=0;i<100;i++) { 50 double mid=(lb+ub)/2; 51 if(check(mid)) { 52 lb=mid; 53 } else { 54 ub=mid; 55 } 56 } 57 printf("%.2f\n",lb); 58 } 59 int main() 60 { 61 solve(); 62 63 return 0; 64 }