POJ2976 Dropping tests (分数规划)

来源:互联网 发布:org.apache.http jar 编辑:程序博客网 时间:2024/05/16 10:41

传送门

今天在看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;}
0 0
原创粉丝点击