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; }
相关文章推荐
- Java 面试题和答案 - (下)
- Sticks
- Leetcode #3 Longest Substring Without Repeating Characters
- 深入分析AsyncTask
- yii框架循环添加只能加入最后一条的解决办法
- Find the difference——Difficulty:Easy
- 7_13_E题 Pie(二分)
- HBase协处理器
- SourceTree windows版本免注册免登陆使用方法
- 【NOIP模拟】树上摩托
- 7_13_B题 Boonie and Clyde(tarjan求割点)
- 7_13_A题 SPF (tarjan求割点)
- NOIP提高组模拟 树上摩托
- 智能硬件开发如何选择低功耗MCU?
- 【读书笔记】《Web全栈工程师的自我修养》
- 7_11_I题 Gems Fight!(状压dp)
- Android手势识别
- 7_11_ H题 Rabbit Kingdom(容斥+树状数组)
- NCPC 2014 H clock pictures
- 关于操作系统需要掌握的一些基本常识