二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

题意:

给你若n个分数,分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i=1nai∑i=1nbi100\cdot\tfrac{\sum_{i=1}^{n} a_{i}}{\sum_{i=1}^{n} b_{i}}100i=1nbii=1nai,求任意去掉k个分数后,公式结果最大值。

题目:

In a certain course, you take n tests. If you get aia_{i}ai out of bib_{i}bi questions correct on test i, your cumulative average is defined to be

100⋅∑i=1nai∑i=1nbi100\cdot\tfrac{\sum_{i=1}^{n} a_{i}}{\sum_{i=1}^{n} b_{i}}100i=1nbii=1nai

Given your test scores and a positive integer k, determine how high you can make your cumulative average if you are allowed to drop any k of your test scores.

Suppose you take 3 tests with scores of 5/5, 0/1, and 2/6. Without dropping any tests, your cumulative average is 100⋅5+0+25+1+6100\cdot\tfrac{5+0+2}{5+1+6}1005+1+65+0+2. However, if you drop the third test, your cumulative average becomes 100⋅5+05+1≈83.33≈83100\cdot\tfrac{5+0}{5+1}\approx83.33\approx831005+15+083.3383.

Input

The input test file will contain multiple test cases, each containing exactly three lines. The first line contains two integers, 1 ≤ n ≤ 1000 and 0 ≤ k < n. The second line contains n integers indicating ai for all i. The third line contains n positive integers indicating bi for all i. It is guaranteed that 0 ≤ ai ≤ bi ≤ 1, 000, 000, 000. The end-of-file is marked by a test case with n = k = 0 and should not be processed.

Output

For each test case, write a single line with the highest cumulative average possible after dropping k of the given test scores. The average should be rounded to the nearest integer.

Sample Input

3 1
5 0 2
5 1 6
4 2
1 2 7 9
5 6 7 9
0 0

Sample Output

83
100

Hint

To avoid ambiguities due to rounding errors, the judge tests have been constructed so that all answers are at least 0.001 away from a decision boundary (i.e., you can assume that the average is never 83.4997).

分析:

  • 01分数规划:
    简单的来说,就是有一些二元组(ai,bi),从中选取一些二元组,使得∑ai / ∑bi最大(最小)。
    这种题一类通用的解法就是,我们假设x = ∑ai / ∑bi的最大(小)值,那么就有x * ∑ai = ∑bi ,即∑ai - x * ∑bi= 0。也就是说,当某一个值x满足上述式子的时候,它就是要求的值。我们可以想到枚举……不过再想想,这个可以二分答案。
    所以我们直接二分答案,当上述式子>0,说明答案小了,<0则说明答案大了,这样计算即可。
    01分数规划问题相关算法详解

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=1e3+10;
const double eps=1e-4;
int n,m;
double a[M],b[M],c[M];
bool cmp(double u,double v){return u>v;
}
bool dfs(double x){for(int i=0;i<n;i++){c[i]=a[i]-x*b[i];}sort(c,c+n,cmp);double ans=0.0;for(int i=0;i<n-m;i++)ans+=c[i];if(ans>=0) return true;return false;
}
int main(){while(~scanf("%d%d",&n,&m)){if(n==0&&m==0)break;for(int i=0;i<n;i++)scanf("%lf",&a[i]);for(int i=0;i<n;i++)scanf("%lf",&b[i]);double r=0.0,l=1.0;while(l-r>eps){double mid=(r+l)/2;if(dfs(mid)) r=mid;else l=mid;}printf("%.0f\n",r*100);}return 0;
}

基本01分数规划问题

给定 n 个二元组 (ai,bia_{i},b_{i}ai,bi ) aia_{i}ai是选择此二元组获得的价值(非负),bib_{i}bi是选择此二元组付出的代价(非负),设 xix_{i}xi (xix_{i}xi ∈ { 0 , 1 } ) 代表第 i个二元组的选与不选,最大(小)化下式
max(ormax(ormax(or min)min)min) r=∑i=1nai⋅xi∑i=1nbi⋅xir=\tfrac{\sum_{i=1}^{n} a_{i}\cdot x_{i}}{\sum_{i=1}^{n} b_{i}\cdot x_{i}}r=i=1nbixii=1naixi
下面先说最大化

解决方法:二分法

设 r最大值为r∗r^{∗}r
r∗r^{∗}r=∑i=1nai⋅xi∑i=1nbi⋅xi=\tfrac{\sum_{i=1}^{n} a_{i}\cdot x_{i}}{\sum_{i=1}^{n} b_{i}\cdot x_{i}}=i=1nbixii=1naixi
⇔\Leftrightarrow ∑ai⋅xi−r∗⋅∑bi⋅xi=0\sum a_{i}\cdot x_{i}-r^{*}\cdot\sum b_{i}\cdot x_{i}=0aixirbixi=0
设一个函数,自变量为 r值,
f(r)f ( r )f(r) = ∑ai⋅xi−r∗⋅∑bi⋅xi\sum a_{i}\cdot x_{i}-r^{*}\cdot\sum b_{i}\cdot x_{i}aixirbixi

观察这个函数,假如xi{x_{i}}xi固定,则这个函数就是坐标系中一条直线( y = B − A ⋅ x),每一组xix_{i}xi对应着一条直线,这些直线斜率非正(因为 − A = − ∑bi⋅xib_{i} ⋅ x_{i}bixi ≤ 0),纵截距非负(因为 B = ∑ai⋅xi≥0)a_{i}⋅ x_{i} ≥ 0)aixi0),如图1。
在这里插入图片描述

对于每一条直线,当f(r)=0f ( r ) = 0f(r)=0时,横截距就是这一组的 r,那么r∗r^{*}r 就是每条直线横截距的最大值(每组xix_{i}xi对应r的最大值)如图2。
在这里插入图片描述

在图中上任取一条垂直x轴的竖线,
如果存在直线与这条竖线的交点纵坐标为正,那么最优值一定在当前竖线的右侧;
如果所有直线与这条竖线交点纵坐标为负,那么最优值一定在当前竖线的左侧;
如果所有直线与这条竖线交点纵坐标非正且存在直线与这条竖线交点纵坐标为0,那么当前竖线横坐标即为最优值r∗r^{*}r

按照这个思想,可以二分答案r,那么二分时如何进行判断呢?

选择一个 r时需要判断所有 f(r)f ( r )f(r)的最大值是否为0,如果 maxm a xmax {f(r)f ( r )f(r) } > 0则 r < r∗r^{∗}r
怎样求 maxf(r)m a x { f ( r ) }maxf(r)?
f(r)f ( r )f(r) = ∑ai⋅xi−r⋅∑bi⋅xi\sum a_{i}\cdot x_{i}-r\cdot\sum b_{i}\cdot x_{i}aixirbixi
⇔\Leftrightarrow∑(ai−r⋅bi)⋅xi\sum( a_{i}-r\cdot b_{i})\cdot x_{i}airbi)xi
二分一个 r时,每个二元组的(ai−r⋅bi)⋅xi( a_{i}-r\cdot b_{i})\cdot x_{i}airbi)xi都可以求出,设其为weightiweight_{i}weighti,现在的目标就是找到一组 xix_{i}xi使得 ∑ wighti⋅xiw i g h t _{i} ⋅ x_{ i}wightixi 最大(即求maxf(r)m a x { f ( r ) }maxf(r))。怎么找到这一组xix_{i}xi,或者直接求得 maxf(r)m a x { f ( r ) }maxf(r) 呢?具体问题具体分析,经常借助最短路算法判断是否存在负环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JavaWeb-JavaScript]JavaScript变量

变量 * 变量&#xff1a;一小块存储数据的内存空间* Java语言是强类型语言&#xff0c;而JavaScript是弱类型语言。* 强类型&#xff1a;在开辟变量存储空间时&#xff0c;定义了空间将来存储的数据的数据类型。只能存储固定类型的数据* 弱类型&#xff1a;在开辟变量存储空间时…

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem

题目描述 输入描述: 输出描述: 示例1 输入 3 输出 5 分析&#xff1a; 1.这个题其实考的是一个莫比乌斯反演题&#xff0c;但是由于我知识储备不够&#xff0c;没有看出来&#xff0c;题目给的范围可以瞎搞一下&#xff0c;所以下面容斥可以过。 2.转换一下就是一道经典的…

猎鹰与龙飞船基于Linux,采用C++、Chromium与JS开发

最近两天科技界最重大的事件莫过于马斯克的 SpaceX 成功实现了猎鹰 9 号&#xff08;Falcon 9&#xff09;带着龙飞船&#xff08;Crew Dragon&#xff09;成功发射&#xff0c;并使飞船与国际空间站对接&#xff0c;将 NASA 两名宇航员送上了轨道前哨。背后关于 Falcon 9 与 C…

[JavaWeb-JavaScript]JavaScript运算符

运算符 1. 一元运算符&#xff1a;只有一个运算数的运算符&#xff0c;-- &#xff0c; (正号) * --: 自增(自减)* (--) 在前&#xff0c;先自增(自减)&#xff0c;再运算* (--) 在后&#xff0c;先运算&#xff0c;再自增(自减)va* (-)&#xff1a;正负号* 注意&#xff1a;…

java编码给出二维数组List<List<Integer>>matrix,输出每列最小的值

import java.util.LinkedList; import java.util.List;public class Main {public static void main(String[] args){/** a 是一个链表 &#xff0c;链表里面存放的对象是List<Integer>a* temp 是 List<Integer>* */List<List<Integer>> a new Linked…

博客系统知多少:揭秘那些不为人知的学问(四)

点击上方关注“汪宇杰博客” ^_^上篇《博客系统知多少&#xff1a;揭秘那些不为人知的学问&#xff08;三&#xff09;》介绍了博客协议或标准。本篇终章介绍设计博客系统有哪些知识点。1.“博客”的前世今生2.我的博客故事3.谁是博客的受众&#xff1f;4. 博客基本功能设计要点…

[JavaWeb-JavaScript]JavaScript特殊语法

JS特殊语法&#xff1a; 1. 语句以;结尾&#xff0c;如果一行只有一条语句则 ;可以省略 (不建议)2. 变量的定义使用var关键字&#xff0c;也可以不使用* 用&#xff1a; 定义的变量是局部变量* 不用&#xff1a;定义的变量是全局变量(不建议)

动态规划专题

目录动态规划基础钢条切割矩阵链乘法动态规划原理最优子结构经典问题&#xff1a;子问题重叠重构最优解最长公共子序列最优二叉搜索树最长连续不下降子序列最长不下降子序列经典问题&#xff08;来自习题&#xff09;DAG 中的最长简单路径最长回文子序列最长回文子串记忆化搜索…

Azure 国际版与中国版服务列表对(2020年6月版)

点击上方关注“汪宇杰博客” ^_^对于选择Azure平台的用户来说&#xff0c;会面临选择国内还是国际版的问题。由于一些原因&#xff0c;由世纪互联运营的中国大陆版Azure无法落地所有的国际版服务。相比几年前&#xff0c;情况已经有了一定的改善。本文列出了国际版和国内版Azur…

[JavaWeb-JavaScript]JavaScript流程控制语句

流程控制语句&#xff1a; 1. if...else...2. switch:* 在java中&#xff0c;switch语句可以接受的数据类型&#xff1a; byte int shor char,枚举(1.5) ,String(1.7)* switch(变量):case 值:* 在JS中,switch语句可以接受任意的原始数据类型3. while4. do...while5. for

解读三组容易混淆的Dockerfile指令

长话短说&#xff0c;今天分享三组容易混淆的Dockerfile指令&#xff0c; 帮助大家编写更优雅的Dockfile文件、构建更纯净的Docker镜像。COPY vs ADDCOPY、ADD主体功能类似&#xff1a;从指定位置src拷贝文件到Docker镜像dest。COPY <src>... <dest> ADD <src&…

[JavaWeb-HTML]HTML概念介绍和快速入门

HTML 1. 概念&#xff1a;是最基础的网页开发语言* Hyper Text Markup Language 超文本标记语言* 超文本:* 超文本是用超链接的方法&#xff0c;将各种不同空间的文字信息组织在一起的网状文本.* 标记语言:* 由标签构成的语言。<标签名称> 如 html&#xff0c;xml* 标记…

ASP.NET Core使用Nacos SDK访问阿里云ACM

背景 前段时间&#xff0c;cranelee 在Github上给老黄提了个issues&#xff0c; 问到了如何用Nacos的SDK访问阿里云ACM。https://github.com/catcherwong/nacos-sdk-csharp/issues/13刚看到这个issues的时候&#xff0c;老黄也是觉得一脸懵逼&#xff0c;好像这两者没有什么必然…

[JavaWeb-JavaScript]JavaScript_Function函数(方法)对象

Function&#xff1a;函数(方法)对象 1. 创建&#xff1a;1. var fun new Function(形式参数列表,方法体); //忘掉吧2. function 方法名称(形式参数列表){方法体}3. var 方法名 function(形式参数列表){方法体}2. 方法&#xff1a;3. 属性&#xff1a;length:代表形参的个数…

java基础输入输出语句

输入语句 方法一&#xff1a; System.in和System.out方法 缺点一: 该方法能获取从键盘输入的字符&#xff0c;但只能针对一个字符的获取缺点二: 获取的只是char类型的。如果想获得int,float等类型的输入,比较麻烦。 import java.io.IOException; public class test {public…

为.netcore助力--WebApiClient正式发布core版本

1、前言NCC WebApiClient 已成熟稳定&#xff0c;发布了WebApiClient.JIT 和 WebApiClient.AOT 两个 NuGet 包&#xff0c;累计近 10w 次下载。我对它的高可扩展性设计相当满意和自豪&#xff0c;但 WebApiClient 并不因此而停下脚步&#xff0c;在一年前&#xff0c;我产生了编…

[JavaWeb-JavaScript]JavaScript_Data日期对象

Date&#xff1a;日期对象 1. 创建&#xff1a;var date new Date();2. 方法&#xff1a;toLocaleString()&#xff1a;返回当前date对象对应的时间本地字符串格式getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差示例代码如下: <!DOCTYPE …

括号匹配+Java栈

括号匹配 import java.util.LinkedList;class MyStack{private int num;private LinkedList<Character>date;public MyStack(){this.num0;datenew LinkedList<Character>();}public boolean isEmpty(){return num0?true:false;}public void push(Character ch){t…

一个static和面试官扯了一个小时,舌战加强版

一&#xff1a;背景1. 讲故事最近也是奇怪&#xff0c;在社区里看到好几篇文章聊static 的玩法以及怎么拿这个和面试官扯半个小时&#xff0c;有点意思&#xff0c;点进去看都是java版的&#xff0c;这就没意思了&#xff0c;怎么也得有一篇和面试官扯C# 中的 static用法撒&…