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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值