Dropping tests-------------------------------思维(0/1分数规划+二分)

Dropping tests-------------------------------思维(0/1分数规划+二分)_第1张图片
Dropping tests-------------------------------思维(0/1分数规划+二分)_第2张图片
Dropping tests-------------------------------思维(0/1分数规划+二分)_第3张图片
解析:
0/1分数规划模板题
二分最大值mid
ai-bimid>=0。
通过上面公式算出t[i]=ai-bi
mid,然后排序t数组 删除前k个值,算出总和
如果总和<0 说明mid 大了,这时候R=mid
否则 说明mid小了,这时候L=mid

#include <iostream>
#include<algorithm>
using namespace std;
int n,k;
int  a[10005],b[10005];
double res[10005];
bool check(double x)
{
    for(int i=1;i<=n;i++) res[i]=(a[i]-x*b[i]);
    sort(res+1,res+1+n);
    double sum=0;
    for(int i=n;i>=k+1;i--)  sum+=res[i];
    return sum>=0;
}
int main()
{
   while(scanf("%d %d",&n,&k))
   {
       if(n==0&&k==0) break;
       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-4)
       {
           double mid=(l+r)/2;
           if(check(mid)) l=mid;
           else r=mid;
       }
       printf("%.0lf\n",100.0*l);
   }
    return 0;
}

你可能感兴趣的:(0/1分数规划,二分)