poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111
2015-07-31 12:41
495 查看
poj 2976:
题意:
在n场考试中,每场考试共有b题,答对的题目有a题。
允许去掉k场考试,求能达到的最高正确率是多少。
解析:
假设已知准确率为x,则每场考试对于准确率的贡献值为:
a - b * x,将贡献值大的排序排在前面舍弃掉后k个。
然后二分x就行了。
代码:
poj 3111:
也是贡献度的问题,不一样的就是循环的次数过多会超时和输出答案。
代码:
题意:
在n场考试中,每场考试共有b题,答对的题目有a题。
允许去掉k场考试,求能达到的最高正确率是多少。
解析:
假设已知准确率为x,则每场考试对于准确率的贡献值为:
a - b * x,将贡献值大的排序排在前面舍弃掉后k个。
然后二分x就行了。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #include <vector> #include <queue> #include <map> #include <climits> #include <cassert> #define LL long long using namespace std; const int inf = 0x3f3f3f3f; const double eps = 1e-8; const double pi = acos(-1.0); const double ee = exp(1.0); const int maxn = 1000 + 10; int n, k; double x; struct Test { int a, b; bool operator < (const Test &t)const { return a - x * b > t.a - x * t.b; } } test[maxn]; bool ok(double mi) { x = mi; sort(test, test + n); double sumA = 0, sumB = 0; for (int i = 0; i < n - k; i++) { sumA += test[i].a; sumB += test[i].b; } return mi < (sumA / sumB); } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL while (~scanf("%d%d", &n, &k)) { if (!n && !k) break; for (int i = 0; i < n; i++) { scanf("%d", &test[i].a); } for (int i = 0; i < n; i++) { scanf("%d", &test[i].b); } double lo = 0, hi = 1.0; for (int i = 0; i <= 100; i++) { double mi = (lo + hi) / 2; if (ok(mi)) lo = mi; else hi = mi; } printf("%.0lf\n", lo * 100); } return 0; }
poj 3111:
也是贡献度的问题,不一样的就是循环的次数过多会超时和输出答案。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #include <vector> #include <queue> #include <map> #include <climits> #include <cassert> #define LL long long using namespace std; const int inf = 0x3f3f3f3f; const double eps = 1e-8; const double pi = acos(-1.0); const double ee = exp(1.0); const int maxn = 100000 + 10; int n, k; double x; struct Jewel { int v, w; int id; bool operator < (const Jewel &t)const { return v - x * w > t.v - x * t.w; } } jewel[maxn]; int ans[maxn]; bool ok(double mi) { x = mi; sort(jewel, jewel + n); double sumV = 0, sumW = 0; for (int i = 0; i < k; i++) { sumV += jewel[i].v; sumW += jewel[i].w; } return mi < (sumV / sumW); } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL while (~scanf("%d%d", &n, &k)) { double maxx = 0; for (int i = 0; i < n; i++) { scanf("%d", &jewel[i].v); scanf("%d", &jewel[i].w); jewel[i].id = i; maxx = max(maxx, (double)jewel[i].v / jewel[i].w); } double lo = 0, hi = maxx; for (int i = 0; i <= 50; i++) { double mi = (lo + hi) / 2; if (ok(mi)) lo = mi; else hi = mi; } for (int i = 0; i < k; i++) { ans[i] = jewel[i].id + 1; } sort(ans, ans + k); for (int i = 0; i < k; i++) { printf("%d%c", ans[i], i == k - 1 ? '\n' : ' '); } } return 0; }
相关文章推荐
- Leetcode #238 Product of Array Except Self
- POJ 2362:Square 觉得这才算深度搜索
- C#实现的word转html命令行工具
- Java中一些误区,个人经验!
- POJ 2362:Square 觉得这才算深度搜索
- Windows 10序列号
- 分球问题(DP/C++)
- HDOJ 找新朋友 1286【欧拉函数】
- Windows 10 安装及应用体验(图文)
- C++ Virtual详解
- ubuntu系统R语言安装 XML包
- 广搜简单题
- 分享一个用于统计MATLAB代码行数的小程序
- 使用Gitblog和Markdown搭建自己的博客网站
- mysql自动定时备份数据库的最佳方法-支持windows系统
- MVVM中写代码的模块区域划分
- 怎样看待比自己强的人
- 码农《三》
- Dom4J qname
- RapidMiner之Repository源码分析