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 ...
随机推荐
- element-ui获取用户选中项
<el-table :data="tableData" stripe border style="width: 100%" @selection-chan ...
- Hinton胶囊网络后最新研究:用“在线蒸馏”训练大规模分布式神经网络
Hinton胶囊网络后最新研究:用“在线蒸馏”训练大规模分布式神经网络 朱晓霞发表于目标检测和深度学习订阅 457 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等价格 立即抢购 ...
- IE6/7下Select控件Display属性无效解决办法
HTML的Select控件,C#的DropDownList服务器控件 设置父类型Display属性之后,在IE6/7上无效 直接将下段javascript脚本添加到页面中即可 <script t ...
- nodejs连接mysql数据库,报错Client does not support authentication protocol requested by server的解决方法
最近想要尝试nodejs连接本地数据库,往全栈方向做一个小小的尝试,于是下载了一个 MySQL8.0,发现Navicat连接不上,结果就下载了mysql自身的Workbench,继续使用. 然而,难受 ...
- Oracle复习
这阵子忙着面试 ,之前搞项目一直用的 mysql ,然后面试的大公司!(呵呵)偏偏用的是 oracle 没办法恶补 前面学过的但是没怎么用的Oracle 基础知识,打算主要从下面几点入手. 环境搭建: ...
- liteide
/liteide$ bin/liteide Cannot mix incompatible Qt library (version 0x40806) with this library (versio ...
- Go part 4 数据容器(数组,slice,string,map,syncMap,list)
数组 数组是值类型,因此改变副本的值,不会影响到本身 数组的定义:var 变量名 [元素数量] T 变量名(符合标识符要求即可) 元素数量(整型,可以是const中的值) T(可以是任意基本类型,包括 ...
- SQLAlchemy 在查询期间丢失与MySQL服务器的连接
遇到问题 pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query') 建立的 pymysq ...
- MySQL5.6.11安装步骤(Windows7 64位)
1. 下载MySQL Community Server 5.6.21,注意选择系统类型(32位/64位) 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下. 3. 添加环境变量 ...
- Oracle dump函数的用法
一.函数标准格式: DUMP(expr[,return_fmt[,start_position][,length]]) 基本参数时4个,最少可以填的参数是0个.当完全没有参数时,直接返回null.另外 ...