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 ...
随机推荐
- 学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群
学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群 机器之心发表于机器之心订阅 499 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等 ...
- [jquery]ajax最最常用的七个属性
1.url 类型:String 默认值: 当前页地址.发送请求的地址. 2.data 类型:String 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 pr ...
- (一)Spring框架基础
一.什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,i ...
- (九)Redis之集群概述(转)
本章转自: http://blog.java1234.com/blog/articles/325.html Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案 ...
- JS实现当前选择日期是星期几
使用到的日期插件是My97 Datepicker,这里通过onpicked方法触发getDay()方法,在getDay()方法中获取已选择的日期来判断是星期几. 插件下载地址:http://www.m ...
- 如何在vscode中调试vue-cli项目?
一:参考官网文档,写的还是很清楚的:https://cn.vuejs.org/v2/cookbook/debugging-in-vscode.html 二:需要安装的东西和初始项目 2.1 用vue ...
- For... in 及 For… of 及 forEach
For... in 及 For… of let arr = ["a","b"]; for (let a in arr) { console.log(a) // ...
- iOS8中UIActionSheet弹出UIImagePickerController异常处理
iOS8之后,UIActionSheet改父于UIAlertController.带来了一丢丢兼容性的问题. 比如在弹出的actionsheet中选择从相册选择图片或者拍照,之后弹出UIImagePi ...
- spring data 入门
提出问题 我是Sping Data,是程序员的春天,因为我提供很多接口给开发人员, 减少程序员重复的写CRUD和分页等方法,你们也可以叫我春D,或者春帝,因为我很酷 解决问题 在Spring Data ...
- json _ ajax_跨域
1 json 1 js 对象 语法: 1 通过一对{}表示一个对象 2 在{}中允许通过 key:value 的形式来表示属性 3 多对的属性和值之间使用 , 隔开 2 什么中JSON 按照JS对象的 ...