poj2976(01分数规划)

链接:点击打开链接

题意;有n场考试,给出每场答对的题数a和这场一共有几道题b,求去掉k场考试后,公式.的最大值

代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
double a[1005],b[1005],c[1005];
int judge(double mid){
    int i;
    double ans=0;
    for(i=1;i<=n;i++)
    c[i]=a[i]-mid*b[i];
    sort(c+1,c+n+1);
    for(i=n;i>m;i--)
    ans+=c[i];
    if(ans>=0)
    return 1;
    return 0;
}
int main(){                                     //01分数规划,下面博客讲的特别详细
    int i,j;                                    //http://www.cnblogs.com/perseawe/archive/2012/05/03/01fsgh.html
    double l,r,mid;
    while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
        for(i=1;i<=n;i++)
        scanf("%lf",&a[i]);
        for(i=1;i<=n;i++)
        scanf("%lf",&b[i]);
        l=0,r=INF*1.0;
        for(i=1;i<=100;i++){
            mid=(l+r)/2;
            if(judge(mid))
            l=mid;
            else
            r=mid;
        }
        printf("%.0lf\n",l*100);
    }
    return 0;
}

你可能感兴趣的:(奇思妙想系列)