Poj 2976 Dropping tests(01分数规划 牛顿迭代)
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分数规划 牛顿迭代)的更多相关文章
- POJ 2976 Dropping tests 01分数规划 模板
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6373 Accepted: 2198 ...
- POJ 2976 Dropping tests 01分数规划
给出n(n<=1000)个考试的成绩ai和满分bi,要求去掉k个考试成绩,使得剩下的∑ai/∑bi*100最大并输出. 典型的01分数规划 要使∑ai/∑bi最大,不妨设ans=∑ai/∑bi, ...
- $POJ$2976 $Dropping\ tests$ 01分数规划+贪心
正解:01分数规划 解题报告: 传送门! 板子题鸭,,, 显然考虑变成$a[i]-mid\cdot b[i]$,显然无脑贪心下得选出最大的$k$个然后判断是否大于0就好(,,,这么弱智真的算贪心嘛$T ...
- POJ - 2976 Dropping tests(01分数规划---二分(最大化平均值))
题意:有n组ai和bi,要求去掉k组,使下式值最大. 分析: 1.此题是典型的01分数规划. 01分数规划:给定两个数组,a[i]表示选取i的可以得到的价值,b[i]表示选取i的代价.x[i]=1代表 ...
- POJ 2976 Dropping tests(分数规划)
http://poj.org/problem?id=2976 题意: 给出ai和bi,ai和bi是一一配对的,现在可以删除k对,使得的值最大. 思路: 分数规划题,可以参考<挑战程序竞赛> ...
- [poj 2976] Dropping tests (分数规划 二分)
原题: 传送门 题意: 给出n个a和b,让选出n-k个使得(sigma a[i])/(sigma b[i])最大 直接用分数规划.. code: //By Menteur_Hxy #include & ...
- Dropping tests(01分数规划)
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8176 Accepted: 2862 De ...
- [poj2976]Dropping tests(01分数规划,转化为二分解决或Dinkelbach算法)
题意:有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值 解题关键:01分数规划,double类型二分的写法(poj崩溃,未提交) 或者r-l<=1e-3(右 ...
- POJ2976 Dropping tests —— 01分数规划 二分法
题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total S ...
随机推荐
- asp.net core-10.Http请求的处理过程
左边是一个普通的网页请求过程,右边是.net core请求过程 这是大致请求流程图:
- IDEA GIT 忽略文件 最佳方式
前言 转载一篇博客,简单,实用. 原文地址:intellij idea 忽略文件不提交 ps:下面均为转载博客的内容: 在intellij中忽略提交文件,分两种情况, 文件没有纳入版本管理 第一种,文 ...
- (二)Struts.xml文件详解
一.Struts.xml文件 Struts.xml文件构成 如图,<Struts>标签内共有5个子标签. 1.1 struts-default.xml 查看Struts的内容可知,Stru ...
- 在CentOS部署AspNetCore网站
前段时间某云服务器大促,就买了一台打算折腾一下,买了几个月,却啥也没做,就改了个初始密码.最近快到双十一了,另一家厂商相同配置的服务器价格又便宜了一大截,看来又得剁手了.从今年开始,搜索一下云服务器, ...
- .NET Core使用swagger遇到的坑
今天突然点开写好的接口,突然发现展开时同时展开了两个接口.如图 我点这两个接口任意一个,这两个都会同时展开或折叠. 原因是他们actinName相同,虽然在vs里面只要http方法不同,action是 ...
- Java Web 深入分析(1)B/S架构概述
B/S结构即浏览器和服务器结构.它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构.在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实 ...
- ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 HtmlHelper-超链接方法
一.@Html.ActionLink()概述 在MVC的Rasor视图引擎中,微软采用一种全新的方式来表示从前的超链接方式,它代替了从前的繁杂的超链接标签,让代码看起来更加简洁.通过浏览器依然会解析成 ...
- JS基础_使用工厂方法创建对象(了解下就行了,用的不多)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- POJ2729 Robocode(离散化与模拟-----提醒曾经爱玩游戏的自己没做出这个
题目链接 :http://poj.org/problem?id=2729 题目很长,有不少也是废话.类似小时候玩的坦克大战.每个坦克速度为10,炮弹速度为20.子弹出界就消失,坦克出不了界限.相向的子 ...
- 03 Django之视图函数
一.Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受WEB请求并返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...