博客
关于我
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/

你可能感兴趣的文章
MySQL 中锁的面试题总结
查看>>
MySQL 中随机抽样:order by rand limit 的替代方案
查看>>
MySQL 为什么需要两阶段提交?
查看>>
mysql 为某个字段的值加前缀、去掉前缀
查看>>
mysql 主从
查看>>
mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
查看>>
mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
查看>>
mysql 主从关系切换
查看>>
MYSQL 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>