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

你可能感兴趣的文章
Node-RED中使用node-random节点来实现随机数在折线图中显示
查看>>
Node-RED中使用node-red-browser-utils节点实现选择Windows操作系统中的文件并实现图片预览
查看>>
Node-RED中使用node-red-contrib-image-output节点实现图片预览
查看>>
Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
查看>>
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中使用range范围节点实现从一个范围对应至另一个范围
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Vue3+elementplus实现图片上传下载(最强实践)
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Vue3+Element-ul学生管理系统(第二十二课)
查看>>
Node-RED中怎样让网站返回JSON数据
查看>>
Node-RED中根据HTML文件建立Web网站
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>