POJ 2976 Dropping tests、3111 K Best (二分搜索)
来源:互联网 发布:前端开发算程序员吗 编辑:程序博客网 时间:2024/06/10 00:05
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
把式子展开然后就发现是个贪心了 - - Orz
两道一样的题 就贴下代码好了
AC代码如下:
//// Created by TaoSama on 2015-04-28// Copyright (c) 2015 TaoSama. All rights reserved.//#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int N = 1e5 + 10;int n, k, a[1005], b[1005];double y[1005];bool check(double x) { for(int i = 1; i <= n; ++i) y[i] = a[i] - x * b[i]; sort(y + 1, y + 1 + n); /*for(int i = 1; i <= n; ++i) cout<<y[i]<<' '; cout<<endl<<endl; */ double sum = 0; for(int i = 1; i <= n - k; ++i) sum += y[n - i + 1]; return sum >= 0;}int main() {#ifdef LOCAL freopen("in.txt", "r", stdin);// freopen("out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); while(cin >> n >> k && (n + k)) { for(int i = 1; i <= n; ++i) cin >> a[i]; for(int i = 1; i <= n; ++i) cin >> b[i]; double l = 0, r = 1; for(int i = 0; i < 100; ++i) { double mid = (l + r) / 2; if(check(mid)) l = mid; else r = mid; } cout << (int)(l * 100 + 0.5) << '\n'; } return 0;}
Description
Demy has n jewels. Each of her jewels has some value vi and weight wi.
Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep k best jewels for herself. She decided to keep such jewels that their specific value is as large as possible. That is, denote the specific value of some set of jewels S = {i1, i2, …, ik} as
.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
Input
The first line of the input file contains n — the number of jewels Demy got, and k — the number of jewels she would like to keep (1 ≤ k ≤ n ≤ 100 000).
The following n lines contain two integer numbers each — vi and wi (0 ≤ vi ≤ 106, 1 ≤ wi ≤ 106, both the sum of all vi and the sum of all wi do not exceed 107).
Output
Output k numbers — the numbers of jewels Demy must keep. If there are several solutions, output any one.
Sample Input
3 21 11 21 3
Sample Output
1 2
好像100次T了 - - 然后改成了50次 Orz
AC代码如下:
//// Created by TaoSama on 2015-04-28// Copyright (c) 2015 TaoSama. All rights reserved.//#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int N = 1e5 + 10;int n, k, v[N], w[N];struct Jewel { int id; double y; bool operator<(const Jewel& rhs) const { return y > rhs.y; }} a[N];bool check(double x) { for(int i = 1; i <= n; ++i) { a[i].id = i; a[i].y = v[i] - x * w[i]; } sort(a + 1, a + 1 + n); double sum = 0; for(int i = 1; i <= k; ++i) sum += a[i].y; return sum >= 0;}int main() {#ifdef LOCAL freopen("in.txt", "r", stdin);// freopen("out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); scanf("%d%d", &n, &k); for(int i = 1; i <= n; ++i) scanf("%d%d", v + i, w + i); double l = 0, r = 1e7 + 1; for(int i = 0; i < 50; ++i) { double mid = (l + r) / 2; if(check(mid)) l = mid; else r = mid; } for(int i = 1; i <= k; ++i) printf("%d%c", a[i].id, i == k ? '\n' : ' '); return 0;}
- POJ 2976 Dropping tests、3111 K Best (二分搜索)
- POJ 2976 - Dropping tests(二分搜索)
- POJ - 2976 Dropping tests(二分搜索:最大化平均值)
- POJ 2976 Dropping tests(贪心+二分)
- [POJ 2976] Dropping tests (二分答案)
- Poj 2976 Dropping tests(二分)
- 【POJ】2976 Dropping tests(二分)
- Dropping tests - POJ 2976 二分
- poj 2976 Dropping tests,二分
- POJ 2976 Dropping tests(二分搜索,最大化平均值)
- POJ 2976 Dropping tests【分数规划】【二分搜索】
- poj 2976 Dropping tests(01分数规划+二分)
- POJ 2976 Dropping tests 解题报告(二分)
- POJ - 2976 Dropping tests(二分查找,最大化平均值)
- POJ 2976 Dropping tests(二分查找 最大化平均值)
- 【poj 2976】 Dropping tests 二分(分数优化)
- POJ 2976 Dropping tests (经典变形二分)
- poj 2976 Dropping tests (二分查找)
- 自定义控件三:自定义属性详解
- Xcode控件使用笔记四:UITableView
- JNI函数签名表
- XWPFDOCUMENT java.util.zip.ZipException: oversubscribed dynamic bit lengths tree
- IM语音
- POJ 2976 Dropping tests、3111 K Best (二分搜索)
- codeforces #30E Tricky and Clever Password KMP+Manacher+二分
- 禁止android显示状态栏
- Java移位运算符详解实例——左移位运算符>>、带符号的右移位运算符>>
- 使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(待续)
- Octopress 搭建静态博客网站
- CarPlay/DIO: CommunicationPlugin的基本时序
- 自定义控件四:一个简单的自定义控件实例
- android数据库的基本回顾