博客
关于我
POJ2976 Dropping tests(二分+01分数规划)
阅读量:174 次
发布时间:2019-02-28

本文共 2380 字,大约阅读时间需要 7 分钟。

Description

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

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 . However, if you drop the third test, your cumulative average becomes .

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 15 0 25 1 64 21 2 7 95 6 7 90 0

Sample Output

83100

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分数规划。我们需要求解Σa[i]/Σb[i]的最大值,不妨设此最大值为max,则可知Σa[i]==Σb[i]*max。利用二分,我们可以不断取得mid,并通过Σa[i]与Σb[i]*mid的实际情况判断其相对于标准答案的大小关系。

代码

#include#include
#include
#include
#include
#include
#include
#include
using namespace std;const int mod=1e9+7;const int maxn=1e6+5;typedef long long ll;struct node{ double a,b,c;}s[maxn];bool cmp(node x,node y){ return x.c>y.c;}int k,n;bool check(double x){ double ans=0; for(int i=1;i<=n;i++) s[i].c=100*s[i].a-x*s[i].b; sort(s+1,s+1+n,cmp); for(int i=1;i<=n-k;i++) ans+=s[i].c; if(ans>=0) return false; else return true;}//概率int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); while(scanf("%d%d",&n,&k)&&n+k) { for(int i=1;i<=n;i++) scanf("%lf",&s[i].a); for(int i=1;i<=n;i++) scanf("%lf",&s[i].b); double l=0,r=100; while(r-l>0.001) { double mid=(l+r)/2; if(check(mid)) r=mid; else l=mid; } printf("%.0f\n",l); } return 0;}

转载地址:http://shjj.baihongyu.com/

你可能感兴趣的文章
Luogu2973:[USACO10HOL]赶小猪
查看>>
mabatis 中出现&lt; 以及&gt; 代表什么意思?
查看>>
Mac book pro打开docker出现The data couldn’t be read because it is missing
查看>>
MAC M1大数据0-1成神篇-25 hadoop高可用搭建
查看>>
mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
查看>>
Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
查看>>
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>