您的位置:首页 > 其它

7_13_F题 K Best(二分、最大化平均值)

2016-09-04 15:39 344 查看

7_13_F题 K Best

题意

有n个物品的重量和价值分别是w[i]和v[i],从中选出K个物品使得单位重量的价值最大

思路

二分目标平均值,然后用这个平均值去更新各个宝石的权值,再排序,取前k个判定这个目标是否合法即可,这是最大化平均值的标准做法

代码

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1e6+10;
double avg = 0;
int n,k;
int id[maxn];
struct Je{
double v,w,av;
int idx;
bool operator < (const Je &b) const{
return av > b.av;
}
};
Je jew[maxn];

bool cheak(double mid){
for(int i = 0 ; i < n ; i ++)
jew[i].av = jew[i].v - jew[i].w*avg;
sort(jew,jew+n);
double sumv = 0,sumw = 0;
for(int i = 0 ; i < k ; i ++){
sumv += jew[i].v;
sumw += jew[i].w;
}
return sumv/sumw > mid;
}
int main (){
while(~scanf("%d %d", &n,&k)){
double r = 0;
avg = 0;
for(int i = 0 ; i < n ; i ++){
scanf("%lf %lf",&jew[i].v,&jew[i].w);
jew[i].idx = i+1;
r = max(r,jew[i].v/jew[i].w);
}
double l = 0;
int T = 100;
while(T--){
double mid = (l+r)/2.0;
avg = mid;
if(cheak(mid)) l = mid;
else r = mid;
}
for(int i = 0 ; i < k ; i ++)
printf("%d ",jew[i].idx);
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: