最大化平均值 - 二分搜索
2017-04-13 21:17
246 查看
题意
有n个物品的重量和价值分别是xi和vi. 从中选出k个物品使得单位重量的价值最大.1<=k<=n<=104, 1<=wi, vi<=106.
题解1(二分搜索)
分析
check(x): 可以选择使得单位重量的价值不小于x.二分搜索的难点在于check函数的编写和边界的移动.
代码
#include<set> #include<map> #include<ctime> //CLOCKS_PER_SEC;clock_t t=clock(); #include<cmath> #include<queue> #include<bitset> #include<cctype> #include<cstdio> #include<vector> #include<string> //getline(cin, line); #include<sstream> //stringstream ss(line);(ss is a stream like cin). #include<cstdlib> #include<cstring> #include<float.h> //X=FLT,DBL,LDBL;X_MANT_DIG,X_DIG,X_MIN_10_EXP,X_MIN_10_EXP,X_MIN,X_MAX,X_EPSILON #include<limits.h> //INT_MAX,LLONG_MAX #include<iostream> //ios_base::sync_with_stdio(false); #include<algorithm> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; const double PI = acos(-1.0); const int INF=0x3f3f3f3f; const int Max=1; int n, k, f[10009], w[10009]; bool check(double x){ double y[10009]; for(int i=0; i<n; i++) y[i]=f[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(void){ //freopen("in", "r", stdin); freopen("out", "w", stdout); while(~scanf("%d%d", &n,&k)){ for(int i=0; i<n; i++) scanf("%d %d", w+i, f+i); double l=0, r=INF; for(int i=0; i<100; i++){ double mid=(l+r)/2; if(check(mid)) l=mid; else r=mid; } printf("%.2f\n", r); } return 0; }
相关文章推荐
- poj 3111 K Best 二分搜索 最大化平均值
- 最大化平均值---二分搜索
- 最大化平均值(二分搜索)
- K Best(最大化平均值(二分搜索))
- poj K Best 最大化平均值 二分搜索
- POJ2976二分搜索解决平均值最大化问题
- POJ 2976 Dropping tests(二分搜索,最大化平均值)
- poj 2976 Dropping tests (二分搜索之最大化平均值之01分数规划)
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
- 最大化平均值(二分搜索)
- POJ 3111 K Best(二分搜索,最大化平均值)
- 最大化平均值---二分搜索
- 《挑战程序设计竞赛》3.1.2 二分搜索-最大化平均值 POJ2976 3111
- POJ - 2976 Dropping tests(二分搜索:最大化平均值)
- POJ 3111 K Best &&NYOJ 914 (二分+ 贪心,最大化平均值)
- poj 3104 Drying(二分搜索之最大化最小值)
- K Best POJ - 3111 (二分最大化平均值,注意用G++提交,不然TLE)
- POJ 2976 Dropping tests 【二分:最大化平均值】
- POJ 3111 K Best(二分——最大化平均值)
- POJ - 2976 Dropping tests 二分 最大化平均值