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

你可能感兴趣的文章
MUI框架里的ajax的三种方法
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
Mysql 8.0 新特性
查看>>
MultCloud – 支持数据互传的网盘管理
查看>>
MySQL 8.0.23中复制架构从节点自动故障转移
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>