POJ2976 01分数规划 普通题
Posted 000what
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ2976 01分数规划 普通题相关的知识,希望对你有一定的参考价值。
大意:给定A数组B数组,从中选择N-K个使得R最大,输出Round(100*R);
二分 l 当 F(l) >= 0 时,l = mid,否则,r = mid
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
bool Sqrt(LL n) { return (LL)sqrt(n) * sqrt(n) == n; }
const double PI = acos(-1.0), ESP = 1e-10;
const LL INF = 99999999999999;
const int inf = 999999999, N = 1e3 + 24;
int n, k, a[N], b[N];
double d[N];
bool check(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-6) {
mid = (l + r) / 2;
if(check(mid)) l = mid;
else r = mid;
}
return 100 * mid;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
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]);
printf("%.0f
", solve());
}
return 0;
}
/*
input:
output:
modeling:
methods:
complexity:
summary:
*/
以上是关于POJ2976 01分数规划 普通题的主要内容,如果未能解决你的问题,请参考以下文章
[POJ2976][POJ2728]01分数规划问题的二分答案解法
『POJ 2976』Dropping tests (01分数规划)