先声明这不是水题,不是水题,真的是一道好题,巧妙利用了二分法搜索最大值
Yougth的最大化
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
-
输入
-
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
- 输出使得单位价值的最大值。(保留两位小数) 样例输入
-
3 2 2 2 5 3 2 1
样例输出
-
0.75
-
代码如下,已AC
-
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define exp 1e-5//二分法判断的标志 using namespace std; typedef struct node//定义一个名字叫s的结构体 { double w,v; }s; s p[10005]; double y[10005]; int n,k; int cmp(double a,double b) { if(a>b) return 1; return 0; } int judge(double x)//二分法判断 { for(int i=0;i<n;i++) { y[i]=p[i].v-p[i].w*x; } sort(y,y+n,cmp); double s=0; for(int i=0;i<k;i++) { s+=y[i]; } if(s>=0) return 1; else return 0; } double Search(double ma)//二分法搜索最大值 { double l=0,r=ma; while(r-l>exp) { double mid=(l+r)/2; if(judge(mid)) { l=mid; } else { r=mid; } } return l; } int main() { while(scanf("%d%d",&n,&k)!=EOF){ double ma=0; for(int i=0;i<n;i++) { scanf("%lf%lf",&p[i].w,&p[i].v); if(ma<p[i].v/p[i].w) ma=p[i].v/p[i].w; } printf("%.2lf\n",Search(ma)); } return 0; }//全部定义成double型,便于计算
-
有多组测试数据