今天在看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;
}