码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2976 01分数规划 普通题

时间:2019-10-11 15:19:00      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:width   image   选择   最大   mes   method   string   out   for   

大意:给定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\n", solve());
    }

    return 0;
}
/*
    input:
    output:
    modeling:
    methods:
    complexity:
    summary:
*/

POJ2976 01分数规划 普通题

标签:width   image   选择   最大   mes   method   string   out   for   

原文地址:https://www.cnblogs.com/000what/p/11654300.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!