POJ_P2976 Dropping tests(01分数规划)
来源:互联网 发布:养出通透的皮肤知乎 编辑:程序博客网 时间:2024/06/04 18:25
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)
#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>using namespace std;#define N 1005#define eps 1e-6inline 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[N];int a[N],b[N];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;}
- POJ_P2976 Dropping tests(01分数规划)
- POJ 2976 Dropping tests 01分数规划
- POJ 2976 Dropping tests 01分数规划
- poj-2976-Dropping tests-01分数规划
- POJ 2976 Dropping tests 01分数规划
- 【POJ】2976 Dropping tests 01分数规划
- [poj 2976]Dropping tests 01分数规划
- POJ 2976 Dropping tests (01分数规划)
- POJ 2976 Dropping tests(01分数规划)
- POJ - 2976 Dropping tests 01分数规划
- POJ 2976 Dropping tests 01分数规划
- poj2976 Dropping tests 【01分数规划】
- POJ 2976- Dropping tests -01分数规划
- POJ 2976 Dropping tests 01分数规划
- poj Dropping tests 01分数规划
- Dropping tests--计算方法,01分数规划
- [POJ2976]Dropping tests 01分数规划
- [POJ2976]Dropping tests(01分数规划)
- redis 事务
- Windows8+VS201+Cocos2dx3.6环境搭建
- 图片加载库Glide介绍
- 交叉编译工具链安装
- HTML5的革新——语义化标签
- POJ_P2976 Dropping tests(01分数规划)
- FastFDS原理
- TOJ 3484.Stones
- IoAllocateMdl
- 我是如何学习计算机编程的
- C 结构体 内存分配
- python中的时间和时间格式转换
- 发现自己好久没有来到这里了
- weak_ptr基本用法