最大化平均值

有n个物品的重量和价值分别wi 和 vi。从中选出 k 个物品使得 单位重量 的价值最大。

限制条件:
<= k <= n <= ^
<= w_i <= v_i <= ^6 输入:
n = 3
k = 2
{W, V} = {(2,2), (5,3), (2,1)} 输出:
0.75 (如果选0号和2号,平均价格是 (2 + 1) / (2 + 2) = 0.75)

题解:

一般先想到的肯定是:把物品按照  单位价值  进行排序,然后从大到小贪心地进行选取。但是这个方法对应输入得到的 是 5/7=0.714。不可行。

转换成二分搜索的问题,由之前的博客中,这种题目关键就是 编写二分的条件C(x)。

  • C(x) = 可以选择使得 单位重量的价格 不小于 x

假设 n组数据,那他们 单位重量的价格是:

  • sum(vi) / sum(wi)

因此就变成了:

  • sum(vi) / sum(wi) >= x

转换为:

  • sum(vi - x * wi) >= 0

对 (vi - x * wi )的值进行排序贪心地进行选取。因此:

  • C(x) = ((vi - x*wi) 从大到小排列中的前  k 个的和不小于0),即说明改 x 可以达到 k 个物品的 单位重量的价值
  • 然后,就是用 二分搜索,来进行得到 最大满足这一条件的 x
#include <iostream>
#include <functional>
#include <algorithm>
using namespace std; /*
3
2
2 2 5 3 2 1
*/
const int maxn = + ;
int n, k;
int w[maxn], v[maxn];
double ave[maxn]; //判断是否满足条件
bool C(double x)
{
for (int i = ; i < n; i++)
{
ave[i] = v[i] - x * w[i];
}
//如果要自定义排序,里面别写成int了.....答案会出错...
sort(ave, ave + n, greater<double>()); // for (int i = 0; i < n; i++) {
// cout << ave[i] << " ";
// }
// cout << endl; //按从大到小取k个数求和
double sum = ;
for (int i = ; i < k; i++) {
sum += ave[i];
} //观察是否 可以取到 x为平均值
return sum >= ;
} void solve()
{
int INF = ;
cin >> n >> k;
for (int i = ; i < n; i++)
{
cin >> w[i] >> v[i];
INF += v[i];
} double lh = , rh = INF, mid;
for (int i = ; i < ; i++)
{
mid = (lh + rh) / 2.0;
if (C(mid)) {
lh = mid;
}
else {
rh = mid;
}
}
printf("%.2f\n", lh);
} int main()
{
solve();
return ;
}

习题:POJ 2976 Dropping tests

来源:http://poj.org/problem?id=2976

题意:题目就是说,n个题目你可以少做k个题目, 然后 n个题目分别为你得到的分数  ai, 和题目的分数 bi , 有个公式是:

, 要求就是:均值最大为多少,需要四舍五入。输入多组数据,n, k同时为0时,终止输入。和上面的例题属于一模一样的题目, 用二分解决最大化平均值的问题。

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int maxn = + ;
typedef long long LL;
int n, k;
LL a[maxn], b[maxn];
double INF;
double ave[maxn]; bool C(double x)
{
for (int i = ; i < n; i++)
{
ave[i] = a[i] - x * b[i];
} //降序
sort(ave, ave + n, greater<double>()); double sum = ;
for (int i = ; i < n - k; i++)
{
sum += ave[i];
} return sum >= ;
} void solve()
{
double lh = , rh = INF, mid;
for (int i = ; i < ; i++)
{
mid = (lh + rh) / ;
if (C(mid))
{
lh = mid;
}
else
{
rh = mid;
}
}
//和下面那种都可以
printf("%.f\n", lh * );
// cout << fixed << setprecision(0) << lh * 100 << endl;
} int main()
{
while (cin >> n >> k && (n || k))
{
for (int i = ; i < n; i++) {
cin >> a[i];
INF += a[i];
}
for (int i = ; i < n; i++) {
cin >> b[i];
}
solve();
}
return ;
}

二分算法的应用——最大化平均值 POJ 2976 Dropping tests的更多相关文章

  1. POJ - 2976 Dropping tests && 0/1 分数规划

    POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} ...

  2. POJ 2976 Dropping tests 【01分数规划+二分】

    题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. POJ - 2976 Dropping tests(01分数规划---二分(最大化平均值))

    题意:有n组ai和bi,要求去掉k组,使下式值最大. 分析: 1.此题是典型的01分数规划. 01分数规划:给定两个数组,a[i]表示选取i的可以得到的价值,b[i]表示选取i的代价.x[i]=1代表 ...

  4. POJ 2976 Dropping tests【二分 最大化平均值】

    题意:定义最大平均分为 (a1+a2+a3+---+an)/(b1+b2+---+bn),求任意去除k场考试的最大平均成绩 和挑战程序设计上面的最大化平均值的例子一样 判断是否存在x满足条件 (a1+ ...

  5. POJ 2976 Dropping tests (最大化平均值)

    题目链接:click here~~ [题目大意]给你n个分数的值,要求最小不选k个,使得最后分数相加结果平均值最大 [解题思路]:最大化平均值:參见:click here~~ 代码: #include ...

  6. POJ 2976 Dropping tests 01分数规划 模板

    Dropping tests   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6373   Accepted: 2198 ...

  7. POJ 2976 Dropping tests(01分数规划)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:17069   Accepted: 5925 De ...

  8. POJ 2976 Dropping tests(01分数规划入门)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11367   Accepted: 3962 D ...

  9. POJ 2976 Dropping tests (0/1分数规划)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4654   Accepted: 1587 De ...

随机推荐

  1. Week2-作业一——《构建之法》三章精读之想

    Week2-作业一——精读<构建之法> 前言 其实我本人是不经常看书的,电子书倒是看了不少,实体书真的不经常看,但是为了这次作业的需求,我还是选择静下心来阅读一下这本<构建之法> ...

  2. Alpha版本冲刺(六)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  3. 前端基础(http协议相关篇)

    网络协议篇: 1.http请求过程 DNS解析——tcp三次握手——建立tcp连接后发起http请求——服务器响应http请求 ——浏览器得到资源——浏览器渲染 2.http报文 通用首部:可以出现在 ...

  4. 运行时错误 429,ACTIVEX部件不能创建对象的解决方法小结

    错误描述: 发布在IIS上面的网站运行时出现如下错误: Microsoft VBscrīpt 运行时错误 错误 '800a01ad' ActiveX 部件不能创建对象 这个错误是asp组件未注册,而导 ...

  5. 360Vedio To NFOV Vedio

    Deep 360 Pilot Learning a Deep Agent for Piloting through 360° Sports Videos 源码.数据集和视频演示 ego-centric ...

  6. vm的三种网络模式

    Vm网卡的模式:网络地址转换模式(nat),仅主机(host-only),桥接模式(Brideged) VMware 的几个虚拟设备: ■ VMnet0:这是 VMware 用于虚拟桥接网络下的虚拟交 ...

  7. 实测 | 转型微服务,这4大工具谁是API网关性能最优?

    转自:http://www.servicemesh.cn/?/article/45 作者:Turgay Çelik 翻译:钟毅(Drew Zhong) 原文:Comparing API Gateway ...

  8. 开发模式 MVC、MVP、MVVM和MVX框架模式

    MVX框架模式的了解 MVX框架模式:MVC+MVP+MVVM 1.MVC: Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分开.View通过 ...

  9. Linux_Apache 安装

    1.下载依赖扩展 apr.apr-util.pcre(正则依赖) https://apr.apache.org/download.cgi#aprutil1 apr:http://mirrors.shu ...

  10. pycharm安装jpype报错及解决方法

    安装jpype时发生报错: 按照提示去装了Microsoft visual C++,结果重新安装还是报错,根据https://blog.csdn.net/qq_38934189/article/det ...