POJ_P2976 Dropping tests(01分数规划)
2016-03-13 14:38
399 查看
POJ传送门
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8729 Accepted: 3041
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
随便搞搞了解一下,了解算法
一个二分一个Dinkelbach
速度比较(第一个是二分,第二个是Dinkelbach)
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8729 Accepted: 3041
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
随便搞搞了解一下,了解算法
一个二分一个Dinkelbach
速度比较(第一个是二分,第二个是Dinkelbach)
#include<cstdio> #include<cmath> #include<algorithm> #include<iostream> using namespace std; #define N 1005 #define eps 1e-6 inline int in(int x=0,int v=1,char ch=getchar()){ while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();if(ch=='-') v=-1,ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*v; } struct str{double d;int num;}d ; int a ,b ;int n,m,k; inline int cmp(str a,str b){return a.d>b.d;} void work1(){//二分 m=n-k;double l,r,mid,tmp;mid=0; for(int i=1;i<=n;i++) if(1.0*a[i]/b[i]>mid) mid=1.0*a[i]/b[i]; l=0,r=mid; while(fabs(r-l)>eps){ mid=(l+r)/2.0; for(int i=1;i<=n;i++) d[i].d=a[i]-mid*b[i],d[i].num=i; sort(d+1,d+n+1,cmp);tmp=0; for(int i=1;i<=m;i++) tmp+=d[i].d; if(tmp>0) l=mid;else r=mid; } printf("%.0f\n",l*100); } void work2(){//Dinkelbach m=n-k;long long p,q;double ans=0,L=1; while(fabs(ans-L)>eps){ ans=L; for(int i=1;i<=n;i++) d[i].d=a[i]-L*b[i],d[i].num=i; sort(d+1,d+n+1,cmp);p=q=0; for(int i=1;i<=m;i++) p+=a[d[i].num],q+=b[d[i].num]; L=p*1.0/q; } printf("%.0f\n",L*100); } int main(){ while(scanf("%d%d",&n,&k)!=EOF&&(n||k)){ for(int i=1;i<=n;i++) a[i]=in(); for(int i=1;i<=n;i++) b[i]=in(); work1(); work2(); } return 0; }
相关文章推荐
- VC 2010下安装OpenCV2.4.4
- 树莓派自身摄像头的opencv调用
- shell + ansible + gateone 自动化运维管理
- 20135201李辰希《Linux内核分析》第三次 构造一个简单的Linux系统OS
- /usr/include/linux/input.h 中部分按键与KEY值对应关系
- tomcat与nginx区别
- Linux 的启动流程
- 环境配置文件 ① /etc/profile、② ~/.bash_profile、③ ~/.bashrc、④ /etc/bashrc
- 数据镜像软件DRBD配置和使用!
- shell脚本转换成二进制的可执行文件方法--加密
- linux下安装boost
- 浅析linux下core文件及调试
- 2016.03.13 NSRunloop相关
- 探究 MVC,MVP,MVVM以及VIPER架构
- 【Chromium中文文档】Chromium多进程架构
- Linux笔记(28)——ip地址配置
- nginx禁止访问某个文件和目录(文件夹)
- VS2012 配置 OpenCV3.0
- GNU/Linux下用户、组及权限管理
- Tomcat启动过程(一):从BootStrap到EndPonit