POJ 2976 裸的01分数规划

来源:互联网 发布:优绘下载 mac版 编辑:程序博客网 时间:2024/05/01 14:17

题意:给你n个数对(认为是a数组和b数组吧),从中取n-m个数对,如果选第i个数对,定义x[i]=1,求R=∑(a[i]*x[i])/∑(b[i]*x[i])取得最大值时R的值。输出R*100(保留到整数)
输入:第一行 n,m。第二行 a数组的值,第三行b数组的值。以n=m=0结束。

原题:
这里写图片描述
这里写图片描述
这里写图片描述

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;int n,m,a[10005],b[10005];double c[10005];bool cmp(int a,int b){    return a>b;}bool judge(double k){    for(int i=1;i<=n;i++)    {        c[i]=a[i]-b[i]*k;    }    sort(c+1,c+1+n,cmp);    double sum=0.0;    for(int i=1;i<=m;i++)    {        sum+=c[i];    }    return sum>=0.0;}int main(){    while(scanf("%d%d",&n,&m)&&(n||m))    {        double left=0,right=0x3fffffff;        m=n-m;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        for(int i=1;i<=n;i++)        {            scanf("%d",&b[i]);        }        for(int i=1;i<=100;i++)        {            double mid=(left+right)/2.0;            if(judge(mid))            {                left=mid;            }            else                 right=mid;        }        left=left*100;        printf("%.0f\n",left);    }}
0 0
原创粉丝点击