有n个物品的重量和价值分别是wi 和 vi ,选出k个物品使他们的单位价值最大
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <cmath>
#include <fstream>
const int MAX = 1e5+10;
const double INF = 10;
using namespace std;
int n,k;
double w[MAX],v[MAX];
double y[MAX];
double ans;
bool Chack(double x){
for(int i=0; i<n; i++)
y[i] = v[i] - x * w[i];
sort(y,y+n);
double sum = 0;
for(int i=0; i<k; i++)
sum += y[n-i-1];
return sum >=0;
}
//测试函数
int main(){
ifstream cin ("D:\\钢铁程序员\\程序数据\\055最大化平均值.txt");//从文件读取数据流,省去手动输入的麻烦
if(!cin){//读取如果失败
cout << "ERROR" << endl;
}
cin >> n >> k;
for(int i=0; i<n; i++)
cin >> w[i] >> v[i];
//二分搜索
double l = 0;
double r = INF;
double mid;
int i = 100;
while(i--){
mid = (l+r)/2;
if(Chack(mid)){
l = mid;
}
else
r = mid;
}
cout << r << endl;
cin.close();//打开文件以后要关闭
return 0;
}