题目描述:
有n个物品的重量和价格分别是wi和vi。从中选择出k件物品使得单位重量的价格最大。
限制条件
- 1<<k<<n<<1e10
- 1<<wi,vi<<1e6
样例:
n=2 k=2
(w,v)={(2, 2),(5, 3),(2, 1)}
输出:0.75
思路:
- 可以选择单位重量的价格不小于X
- 问题就变成了求满足的最大X
-
#include <iostream> #include<stdio.h> #include<algorithm> using namespace std; const int inf=1e6+10; const int maxn=1e4+10; int n,k; int w[maxn],v[maxn]; double y[maxn];///v-x*w; bool st(double x) { for(int i=0; i<n; i++) { y[i]=v[i]-x*w[i]; } sort(y,y+n); ///计算数组从大到小前k个数的和 double sum=0; for(int i=0; i<k; i++) { sum+=y[n-i-1]; } return sum>=0; } int main() { scanf("%d%d",&n,&k); for(int i=0; i<n; i++) { scanf("%d%d",&w[i],&v[i]); } double l=0,r=inf; for(int i=0; i<100; i++) { double mid=(l+r)/2; if(st(mid)) { l=mid; } else { r=mid; } } printf("%.2f\n",r); return 0; }