POJ2976 Dropping tests (分数规划)

传送门

今天在看Amber神犇的《最小割模型在信息学竞赛中的应用》的时候看到了分数规划这玩意,然后就小水了一发(虽然这道题和最小割并没有什么关系)。

Dropping tests 是一道裸的01分数规划,大意就是给出n个分数,在里面选出n-k个要求这些分数 分子加分子 : 分母加分母最大。

关于分数规划的介绍,我觉得[Algorithm]01分数规划——Update:2012年7月27日这篇文章写得相当不错

上一下我的代码(采用二分做的,迭代不是很熟,以后再更新)

#include<cstdio>
#include<algorithm>
#define MAXN 1005
#define eps 1e-7
#define max(a, b) (a)>(b) ? (a):(b)
int a[MAXN], b[MAXN];
double l, r, ans, d[MAXN];
int main()
{
    int n, k;
    while(~scanf("%d%d", &n, &k) && n+k)
    {
        l = 0;r = 1;
        for(int i = 1; i <= n; i ++)
            scanf("%d", a + i);
        for(int i = 1; i <= n; i ++)
            scanf("%d", b + i);
        double mid;
        while(l + eps < r)
        {
            ans = 0;
            mid = (l + r) / 2;
            for(int i = 1; i <= n; i ++)
                d[i] = a[i] - mid * b[i];
            std::sort(d+1, d+n+1);
            for(int i = k + 1; i <= n; i ++)
                ans += d[i];
            if(ans > 0) l = mid;
            else r = mid;
        }
        printf("%.0lf\n", mid*100);
    }
    return 0;
}

你可能感兴趣的:(算法,poj)