poj2976

题意

给出 a b 数组,一共 n 对数,其中最多可以去掉 k 对,问怎样使剩下比率(原始比率是 $ \frac{\sum_{i=1}^{n} a}{\sum_{i=1}^{n} b}*100 $)最大。

分析

01分数规划

设 \(l=\frac{\sum a}{\sum b}\),我们要求使得 l 最大,构造新函数 \(F()={\sum a}-l*{\sum b}\),设\(D()=a-l*b\),显然 F() 是随 l 增大单调递减的,如果对于某个 l 使得 F() > 0 ,

则有 \(\frac{\sum a}{\sum b}>l\),那么我们可以知道此时存在比l更优的值(我们要 l 尽可能大);当 F() = 0 时,这个 l 即为所求值;当 F() < 0 时,无意义,此时的 l 根本取不到。

那么 F() 函数的功能是让我们可以不断逼近答案(即告诉我们后面有更优的值),如果我们现在选定了一个 l ,计算出 D 数组,从大到小选 n - k 个,这样使 F() 最大(F()越大,那么告诉我们后面存在更大的 l )。可以二分 l 当 F(l) >= 0 时,l = mid,否则,r = mid。

code

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 1e3 + 10;
const double INF = 1e15;
int n, k;
int a[MAXN], b[MAXN];
double d[MAXN];
int work(double rate) {
for(int i = 0; i < n; i++) {
d[i] = a[i] - rate * b[i];
}
sort(d, d + n);
double F = 0;
for(int i = n - 1; i >= k; i--) {
F += d[i];
}
return F >= 0;
}
double solve() {
double l = 0, r = 1, mid = 0;
while(r - l > 1e-5) {
mid = (l + r) / 2;
if(work(mid)) l = mid;
else r = mid;
}
return mid * 100;
}
int main() {
while(cin >> n >> k && (n + k)) {
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 0; i < n; i++) {
cin >> b[i];
}
printf("%.0f\n", solve());
}
return 0;
}

最新文章

  1. 当AngularJS POST方法碰上PHP
  2. 一些不太常见但很有用的java类
  3. Project Euler欧拉计划
  4. css table-cell实现图文排列水平对齐
  5. JQuery按回车提交数据
  6. 对于新安装的MySQL如何提升MySQL的安全级别
  7. iOS_UIImage_jpg&lt;--&gt;png转换
  8. Qt5_简易画板_详细注释
  9. jdom学习:读取xml文件
  10. 【POJ 2010 Moo University-Financial Aid】优先级队列
  11. &lt;link&gt;: rel, href
  12. [最短路]信使(msner)
  13. Visual studio code离线安装插件
  14. 【热身】github的使用
  15. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包
  16. stl学习记录(2)
  17. SQLite3 使用教学
  18. FeatureTable()
  19. Web前端开发学习笔记(一)
  20. 关于windows的jdk

热门文章

  1. CSS系列(8) CSS后代选择器和子选择器详解
  2. pytest单元测试框架
  3. 使用dib element proliant-tools制作deploy image
  4. CS231n——图像分类(KNN实现)
  5. HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )
  6. Vue.js入门(一)
  7. ci重写 配置文件
  8. 详解Linux运维工程师应具备的十大技能
  9. 获取JNDI数据源
  10. 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并