Dropping tests

Time Limit: 1000MS Memory Limit: 65536K

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 1

5 0 2

5 1 6

4 2

1 2 7 9

5 6 7 9

0 0

Sample Output

83

100

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).

Source

Stanford Local 2005

/*
裸的01分数规划问题.
令∑a[i]/∑b[i]=ans.
则∑a[i]-∑b[i]*ans=0.
二分一个ans.
然后用a[i]-b[i]*ans取前k大检验.
只能去感性的认识orz...
并不会证明..
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#define eps 1e-7
#define MAXN 1001
using namespace std;
double ans,a[MAXN],b[MAXN],sum,tmp[MAXN];
int n,m,k;
bool check(double x)
{
double tot=0;
for(int i=1;i<=n;i++) tmp[i]=a[i]-x*b[i];
sort(tmp+1,tmp+n+1,greater<double>());
for(int i=1;i<=n-k;i++) tot+=tmp[i];
if(tot>=0) return true;
else return false;
}
void slove()
{
double l=0,r=1e4,mid;
while(l<=r)
{
mid=(l+r)/2.0;
if(check(mid)) l=mid+eps,ans=mid;
else r=mid-eps;
}
printf("%.0f\n",ans*100);
return ;
}
int main()
{
while(scanf("%d%d",&n,&k))
{
if(!n&&!k) break;
sum=ans=0;
for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
for(int i=1;i<=n;i++) scanf("%lf",&b[i]);
slove();
}
return 0;
}
/*
发现这题牛顿迭代可做吖.
网上的题解都是二分01规划的.
我就写个牛顿迭代的吧orz(虽然二分的写过).
先选一个估计值s0.
我们能保证这个答案是单调的.
假设上次迭代的ans为s1,
则存在n-k个元素使s1=∑(ai/bi),
变形可得到∑ai-s2*∑bi=0,
令ans[i]=a[i]-b[i]*s0.
取前n-k大统计一个答案.
可知必存在n-k个元素使∑ansi=∑ai-s1*∑bi=0,
所以当我们按ans排序并取前n-k个元素作为求其∑ans时,
∑ansi显然是>=0的,
然后s1=(∑ai-∑ansi)/∑bi)<=(∑ai/∑bi)=s2(i<=n-k).
即此迭代过程是收敛的,当等号成立时,s即为答案.
有些地方还是有点想不通毕竟弱吖orz.
*/
#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAXN 1001
#define eps 1e-7
using namespace std;
double ans,sum,tmp[MAXN];
int n,m,k;
struct data{double a,b,ans;}s[MAXN];
bool cmp(const data &x,const data &y)
{
return x.ans>y.ans;
}
void slove()
{
double suma=0,sumb=0,s0=0,s1=0;
for(int i=1;i<=k;i++) suma+=s[i].a,sumb+=s[i].b;
s0=suma/sumb;
while(abs(s0-s1)>eps)
{
s1=s0;suma=sumb=0;
for(int i=1;i<=n;i++) s[i].ans=s[i].a-s[i].b*s0;
sort(s+1,s+n+1,cmp);
for(int i=1;i<=k;i++) suma+=s[i].a,sumb+=s[i].b;
s0=suma/sumb;
}
printf("%.0f\n",s0*100);
return ;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(!n&&!k) break;
sum=ans=0;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);
slove();
}
return 0;
}

Poj 2976 Dropping tests(01分数规划 牛顿迭代)的更多相关文章

  1. POJ 2976 Dropping tests 01分数规划 模板

    Dropping tests   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6373   Accepted: 2198 ...

  2. POJ 2976 Dropping tests 01分数规划

    给出n(n<=1000)个考试的成绩ai和满分bi,要求去掉k个考试成绩,使得剩下的∑ai/∑bi*100最大并输出. 典型的01分数规划 要使∑ai/∑bi最大,不妨设ans=∑ai/∑bi, ...

  3. $POJ$2976 $Dropping\ tests$ 01分数规划+贪心

    正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...

  4. POJ - 2976 Dropping tests(01分数规划---二分(最大化平均值))

    题意:有n组ai和bi,要求去掉k组,使下式值最大. 分析: 1.此题是典型的01分数规划. 01分数规划:给定两个数组,a[i]表示选取i的可以得到的价值,b[i]表示选取i的代价.x[i]=1代表 ...

  5. POJ 2976 Dropping tests(分数规划)

    http://poj.org/problem?id=2976 题意: 给出ai和bi,ai和bi是一一配对的,现在可以删除k对,使得的值最大. 思路: 分数规划题,可以参考<挑战程序竞赛> ...

  6. [poj 2976] Dropping tests (分数规划 二分)

    原题: 传送门 题意: 给出n个a和b,让选出n-k个使得(sigma a[i])/(sigma b[i])最大 直接用分数规划.. code: //By Menteur_Hxy #include & ...

  7. Dropping tests(01分数规划)

    Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8176   Accepted: 2862 De ...

  8. [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)

    题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...

  9. POJ2976 Dropping tests —— 01分数规划 二分法

    题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS   Memory Limit: 65536K Total S ...

随机推荐

  1. Django dumpdata and loaddata

    目录 dumpdata 命令 dumpdata 基本数据库的转存 dumpdata 备份特定的 app dumpdata 备份特定的表 dumpdata (--exclude) dumpdata (- ...

  2. gin PostForm 方法不起作用

    情景: 在httpie post 下,在 axios post下,总的来说,就是在form-data下只有c.Bind()会有用 如果一定要用c.PostForm() headers必须为x-www- ...

  3. 待续:s5p6818移植 uboot 2014.07 移植

    前言: 之前半年一直在嵌入式Linux移植中挣扎,不知道该从哪个方面开始入手,也失败了很多次,苦思了很久最终决定先从uboot开始. uboot版本的不同会导致添加板子的时候的配置方法会不一样.由于手 ...

  4. (五)web服务中的异常处理

    一.服务端发布服务 package com.webservice; import javax.jws.WebParam; import javax.jws.WebResult; import java ...

  5. (三)XML基础(3):Xpath

    五.XPath:快速定位到节点 5.1 简介 5.2 语法 5.3 案例 XPath对有命名空间的xml文件和没有命名空间的xml定位节点的方法是不一样的,所以再对不同的xml需要进行不同的处理. 使 ...

  6. wstngfw中配置snort

    wstngfw中配置snort 概述 Snort是入侵检测和预防系统.它可以将检测到的网络事件记录到日志并阻止它们.Snort使用称为规则的检测签名进行操作. Snort规则可以由用户自定义创建,或者 ...

  7. R语言学习笔记:glue包实现变量传参

    glue包介绍 glue包可用于自定义变量,然后通过传参的方式,对字符串部分内容进行自适应修改. 例如:可将日期赋值为:date = as.Date("2019-12-05"),然 ...

  8. 关于BOM的一些基本知识以及表格的操作

    首先先了解什么是BOM? BOM:英文全称Browser Object Model,即浏览器对象模型.浏览器页面初始化时,会在内存创建一个全局对象,用来描述当前窗口的属性和状态,这个全局对象被称为浏览 ...

  9. 关于cubic-bezier 贝塞尔曲线的简单了解

    在animation和transition两个属性中,cubic-bezier是控制变化的速度曲线,主要是生成速度曲线的函数 规定用法是: cubic-bezier(<x1>,<y1 ...

  10. Java 面向对象(四)继承

    一.继承的概述(Inherited) 1.由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 其中,多个类可以称为 子类(派生类 ...