有n个物品的重量和价值分别是wi和vi,从中选出k个物品使得单位重量价值最大。
样例输入:
3 2
2 2
5 3
2 1
- 1
- 2
- 3
- 4
样例输出:
0.75
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=100010;
const int INF=1e6;
int n,k;
int w[maxn];
int v[maxn];
double y[maxn];
bool C(double x){
double sum=0;
for(int i=0;i<n;i++)
{
y[i]=v[i]-x*w[i];
}
sort(y,y+n);
for(int i=0;i<k;i++){
sum+=y[n-i-1];
}
return sum>=0;
}
void init(){
cin>>n>>k;
for(int i=0;i<n;i++) cin>>w[i]>>v[i];
}
void solve(){
double left=0;
double right=INF;
for(int i=0;i<100;i++){
double mid=(right+left)/2;
if(C(mid)) left=mid;
else right=mid;
}
printf("%.2f",right);
}
int main(){
init();
solve();
}