AcWing 234. 放弃测试 (01分数规划)打卡

题目:https://www.acwing.com/problem/content/236/

题意:给你一个方程,可以有k个不选,要求最优

思路:看了一下这个方程就知道是01分数规划的模板题,它可以选择k个不要,其实也就是排序的时候选最好的n-k个即可

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
#include <set>
#include <map>
using namespace std;
int n,k,a[2333],b[2333];
double ps[2333];
bool ok(double x)
{
    for(int i=1;i<=n;i++) ps[i]=a[i]-x*b[i];
    sort(ps+1,ps+1+n);
    double ans=0;
    for(int i=n;i>=k+1;i--) ans+=ps[i];
    return ans>=0;
}
void sol()
{
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=1;i<=n;i++) scanf("%d",b+i);
    double l=0,r=1;
    while(r-l>1e-6)
    {
        double mid=(l+r)/2;
        if(ok(mid)) l=mid; else r=mid;
    }
    printf("%.0lf\n",l*100);
}
int main()
{
    while(scanf("%d%d",&n,&k),n|k) sol();
}

猜你喜欢

转载自www.cnblogs.com/Lis-/p/11299741.html