博客
关于我
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中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>
MySql中的concat()相关函数
查看>>
mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
查看>>
MySQL中的count函数
查看>>
MySQL中的DB、DBMS、SQL
查看>>
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>