题干:

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 .

题目大意:

给出n个物品,每个物品有两个属性a和b,选择n-k个元素,询问的最大值。

1<=n<=1000,0<=k<n,0<=ai<=bi<=1000000000。

解题报告:

典型的分数规划。

首先答案是符合单调性的,而就等价于

所以我们发现二分完把ai-x*bi排序后把最大的n-k个选出来就行了。

AC代码:(80ms)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int n,k;
const double eps = 1e-5;
double qq[MAX];
struct Node {double a,b;
} node[MAX];
bool ok(double x) {double res = 0;for(int i = 1; i<=n; i++) qq[i] = node[i].a - x * node[i].b;sort(qq+1,qq+n+1); for(int i = n; i>=k+1; i--) res += qq[i];return res >= 0;
}
int main()
{while(~scanf("%d%d",&n,&k) && n+k) {for(int i = 1; i<=n; i++) scanf("%lf",&node[i].a);for(int i = 1; i<=n; i++) scanf("%lf",&node[i].b);double l = 0,r = 1e9;double mid = (l+r)/2;while(l+eps < r) {mid = (l+r)/2;if(ok(mid)) l = mid;else r = mid;}printf("%d\n",(int)(round(l*100)));//mid-eps?}return 0 ;}

迭代法可以快很多:(30ms)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int n,k;
const double eps = 1e-5;
double qq[MAX],aa,bb;
struct Node {double a,b;
} node[MAX];
struct NN {double a,b,qq;
} q[MAX];
bool cmp(NN a,NN b) {return a.qq < b.qq;
}
double ok(double x) {double res = 0;aa=bb=0;for(int i = 1; i<=n; i++) q[i].qq = node[i].a - x * node[i].b,q[i].a = node[i].a,q[i].b = node[i].b;sort(q+1,q+n+1,cmp); for(int i = n; i>=k+1; i--) aa += q[i].a,bb += q[i].b;return aa/bb;
}
int main()
{while(~scanf("%d%d",&n,&k) && n+k) {for(int i = 1; i<=n; i++) scanf("%lf",&node[i].a);for(int i = 1; i<=n; i++) scanf("%lf",&node[i].b);double l = 0,r = 1e9;double mid = (l+r)/2,ans = -1;while(fabs(ans-mid) >= eps) {ans = mid;mid = ok(mid);}printf("%d\n",(int)(round(ans*100)));//mid-eps?}return 0 ;}

【POJ - 2976】【ZOJ - 3068】【SCU - 2992】Dropping tests (01分数规划)相关推荐

  1. poj 2976 Dropping tests 01分数规划

    题目大意: http://poj.org/problem?id=2976 题解: 裸的01分数规划 #include <cstdio> #include <cstring> # ...

  2. POJ-2976 Dropping tests 01分数规划

    题目链接:http://poj.org/problem?id=2976 很典型的01分数规划,sort+二分即可.注意精度问题,这种四舍五入的问题一般都是两种处理方法:1.printf("% ...

  3. poj 2728 Desert King(最小比率生成树 / 0-1分数规划 / 二分)

    二分答案,我们要找最小的答案,如果有更小的答案说明 ∑W−Z∗∑L<=0∑W−Z∗∑L <= 0∑W−Z∗∑L<=0. #include<cstdio> #include ...

  4. 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976

    题意: 给你若n个分数,分子a[i]a[i]a[i],分母b[i]b[i]b[i],使满足公式100⋅∑i=1nai∑i=1nbi100\cdot\tfrac{\sum_{i=1}^{n} a_{i} ...

  5. Bailian4145 放弃考试 POJ2976 ZOJ3068 Dropping tests【二分法+01分数规划】

    4145:放弃考试 总时间限制: 1000ms 内存限制: 65536kB 描述 在一门课程中,一共有n场考试.假如你在i场考试中可以答对bi道题中的ai道,那么你的累计平均分定义为:100·Σai/ ...

  6. poj 3621 Sightseeing Cows 01分数规划

    题目大意: http://poj.org/problem?id=3621 题解: 首先我们容易发现最优的路线一定只经过一个环. 所以我们可以把点权合并到边权上. 然后就转化为了一个01分数规划问题 求 ...

  7. POJ 2976 01分数规划基础题目

    题意:       给你一组"数",一共n个,每个数有两个权值,价钱a[i],代价b[i],让你选择n - k使得 sigma(a[i]) / sigma(b[i]) * 100 ...

  8. poj2976 Dropping tests(01分数规划 好题)

    https://vjudge.net/problem/POJ-2976 又是一波c++AC,g++WA的题.. 先推导公式:由题意得 Σa[i]/Σb[i]<=x,二分求最大x.化简为Σ(a[i ...

  9. poj 2976 基础01分数规划

    这个题算是01分数规划的最基本的应用了, 01分数规划是给你n对数(a1, b1)....(an, bn), 然后让你选择一些数对, 使得sigma(ai)/sigma(bi)最大.这里附上讲解一份, ...

最新文章

  1. Repeater嵌套
  2. 【解决VMWare中新建虚拟机不支持centos64位的方法】
  3. Apache服务器学习笔记
  4. Java多线程(十)之ReentrantReadWriteLock深入分析
  5. win10中内置的Linux Bash启动闪退问题
  6. 学习笔记(19):Python网络编程并发编程-互斥锁
  7. [python opencv 计算机视觉零基础到实战] 十六、用opencv画画
  8. 神经网络最常用的10个激活函数,一文详解数学原理及优缺点
  9. aixs1 生成java代码_通过axis1.4 来生成java客户端代码
  10. java 继承重写_java 封装 继承 重写 多态
  11. 零元学Expression Design 4 - Chapter 5 教你如何用自制笔刷在5分钟内做出设计感效果...
  12. Listary -- 高效率办公软件
  13. css字体倾斜角度_css如何设置字体倾斜样式
  14. Excel的规划求解【详细步骤】
  15. Byte,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb,Bb单位换算
  16. IDEA的快捷键与qq的冲突了怎么办
  17. Codeforces 1010D Mars rover
  18. 大学计算机实验教程实验6,大学计算机实验教程.第6版
  19. 课堂实验一 SQL基础练习
  20. 2020 夏季短学期实践学习计划与安排

热门文章

  1. 5 html 根据手机转动而转动_手机安装陀螺仪有什么用 手机安装陀螺仪作用介绍【详解】...
  2. C语言实战:(1) 整数的二进制表示
  3. Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
  4. Linux 4.15 rc7,Linux学习之十五(sed命令)-2017-4-23
  5. 7-4 哈利·波特的考试 (25 分)(C语言实现)
  6. 手把手教你从0创建STM32串口空闲+DMA数据接收工程
  7. Java NIO学习
  8. Spring MVC Ajax返回中文乱码
  9. Redis windows学习(一)——redis安装和基础使用
  10. minheight能继承吗_民法典亮点盘点 | 侄子能继承叔叔的遗产吗?