Dropping tests - POJ 2976 二分
来源:互联网 发布:seo职业发展方向 编辑:程序博客网 时间:2024/06/06 02:06
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 15 0 25 1 64 21 2 7 95 6 7 90 0
Sample Output
83100
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).
题意:问n对数中去掉k对后的比最大平均数是多少。
思路:这道题用贪心做找最大价值的做法是不对的。二分枚举这个平均数,然后看如果最大平均数是这个,那么sum的和是否大于0,(sum的意思具体见代码吧)。此外这道题在挑战程序设计竞赛中的145页也有代码。
AC代码如下:
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int n,k;int w[1010];int v[1010];double y[1010];bool solve(double x){ int i; double sum=0; for(i=1;i<=n;i++) y[i]=v[i]-w[i]*x; sort(y+1,y+1+n); for(i=1;i<=n-k;i++) sum+=y[n-i+1]; if(sum>=0) return true; else return false;}int main(){ int i,j; while(~scanf("%d%d",&n,&k) && n>0) { double l=0,r=1000000010,mi; for(i=1;i<=n;i++) scanf("%d",&v[i]); for(i=1;i<=n;i++) scanf("%d",&w[i]); for(i=1;i<=300;i++) { mi=(l+r)/2; if(solve(mi)) l=mi; else r=mi; } printf("%.f\n",l*100); }}
- Dropping tests - POJ 2976 二分
- poj 2976 Dropping tests,二分
- POJ 2976 - Dropping tests(二分搜索)
- POJ 2976 Dropping tests(贪心+二分)
- [POJ 2976] Dropping tests (二分答案)
- POJ 2976 Dropping tests (经典变形二分)
- poj 2976 Dropping tests (二分查找)
- Poj 2976 Dropping tests(二分)
- POJ 2976 Dropping tests 【二分:最大化平均值】
- 【POJ】2976 Dropping tests(二分)
- poj 2519 Dropping tests 二分
- poj 2976 Dropping tests
- POJ 2976 Dropping tests
- POJ 2976 Dropping tests
- poj 2976-Dropping tests
- POJ 2976 Dropping tests
- POJ 2976 Dropping tests
- POJ-2976-Dropping tests
- Apple's OpenGL——Vertex Shader基础
- 迭代器失效
- Android开发 Json服务端调用
- CXF SOAP协议修改为1.2
- Matlab 之图像处理相关函数
- Dropping tests - POJ 2976 二分
- 关于函数strtok和strtok_r的使用要点和实现原理
- Linux压缩和解压缩命令大全
- source insight工程的相对路径
- weblogic上session失效问题
- 关注博主的博文汇总(孙志刚、贺利坚……)
- javascript的bind()函数使用
- maven 自动部署到 tomcat7
- Unity脚本——单例模式