poj 2976(01分数规划最基础)
来源:互联网 发布:腾讯手游助手mac 编辑:程序博客网 时间:2024/05/22 03:13
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).
Source
题目的意思是,给你n对数(a,b)求sigma(a[i]) / sigma(b[i]) 的最大值,其中需要去掉K个数,也就是说求其中N-K个数的最大值。
这个题是01分数规划的超级裸题,提供两种方法,二分和一个叫不上名字的。后者要快,但是不精确,具体用吧。详见代码。
二分:
#include <iostream>#include <cstdio>#include <algorithm>#define MAXN 1111#define eps 1e-6int a[MAXN], b[MAXN];double score[MAXN];using namespace std;int main(){ int n, k; while (~scanf("%d%d", &n, &k) && (n || k)) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); for (int i = 0; i < n; i++) scanf("%d", &b[i]); double l = 0.0, r = 1.0; while (l < r - eps) { double ans = 0; double mid = (l + r) / 2.0; for(int i = 0; i < n; i++) score[i] = a[i] - mid * b[i]; sort(score, score + n); for (int i = n - 1; i >= k; i--) ans += score[i]; if(ans >= 0.0) l = mid; else r = mid; } printf("%d\n",(int)(l * 100 + 0.5)); } return 0;}
方法二:
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;struct N{ int a, b; double c;}node[1111];bool cmp(N a, N b) { return a.c > b.c;}int main(){ int n, k; while (~scanf("%d%d", &n, &k) && (n + k) != 0) { for (int i = 0; i < n; i++) { scanf("%d", &node[i].a); } for (int i = 0; i < n; i++) { scanf("%d", &node[i].b); } double l = 0.5, ans = 0; while (fabs(l - ans) >= 1e-6) { ans = l; for (int i = 0; i < n; i++) node[i].c = node[i].a - l * node[i].b; sort(node, node + n, cmp); double suma = 0, sumb = 0; for (int i = 0; i < n - k; i++) { suma += node[i].a; sumb += node[i].b; } l = suma / sumb; } printf("%d\n", (int)(l * 100 + 0.5)); } return 0;}
- poj 2976(01分数规划最基础)
- POJ 2976 01分数规划基础题目
- poj 2976 Dropping tests(基础的01分数规划)
- POJ 2976 01分数规划
- 01 分数规划 poj 2976
- poj 2976 分数规划
- 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,3111 01分数规划
- POJ 2976 Dropping tests (01分数规划)
- POJ 2976 Dropping tests(01分数规划)
- POJ - 2976 Dropping tests 01分数规划
- POJ 2976 Dropping tests 01分数规划
- POJ 2976 裸的01分数规划
- Mike Gancarz:Linux/Unix设计思想
- 【Android学习链接(网址)整理】
- 012温习汉诺塔 (keep it up)
- java Email
- Tools:VC6.0和SourceInsight下的pclint配置
- poj 2976(01分数规划最基础)
- NYOJ 题目3多边形重心问题(数学几何)
- HDU 1011 Starship Troopers 树形背包
- Hibernate中关于多表连接查询hql 和 sql 返回值集合中对象问题
- 【黑马程序员】黑马入学准备篇:IO输入与输出 【上】
- ASP.NET—014:Gridview复合表头
- Yii2设置网页标题
- 通过浏览器超链接调用本地应用程序
- C# 继承