zoukankan      html  css  js  c++  java
  • 二分搜索(2、Yougth的最大化,无限逼近最大值)

    条件C(x):=可以选择是单位重量的价值不小于x,则该问题就变成了满足C(x)的最大的x,那么怎么判断C(x)是否可行呢?假设我们选了某个物品的集合S,那么它们的单位重量价值是:

    因此就变成了判断是否存在s满足下面条件:

    把这个不等是进行变形就得到

    //#define LOCAL
    #include<cstdio>
    //#include<iostream>注意引入头文件,编译时候需要连接,是费内存的,如果不需要尽量不要引入
    #include<algorithm>
    int const MAX_N=10010;
    int const MAX_M=100;
    double const INF=10000000.0;
    int W[MAX_N],V[MAX_N],n,k;
    double Y[MAX_N];
    void readdate()
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&W[i],&V[i]);
        }
    }
    bool C(double x)
    {
        for(int i=0;i<n;i++)
        {
            Y[i]=V[i]-x*W[i];
        }
        std::sort(Y,Y+n);
        //计算Y数组中从大到小前k个数的和
        double sum=0.0;
        for(int i=0;i<k;i++)
        {
            sum+=Y[n-i-1];
        } 
        return sum>=0;
    }
    void solve()
    {
        double lb=0.0,ub=INF;
        for(int i=0;i<MAX_M;i++)
        {
            double mid=(lb+ub)/2;
            if(C(mid)) lb=mid;
            else ub=mid;
        }
        printf("%.2f
    ",ub);
    }
    int main()
    {
    #ifdef LOCAL
        freopen("914.in","r",stdin);
        freopen("914.out","w",stdout);
    #endif
        ;
        while(~scanf("%d%d",&n,&k))
        {
            readdate();
            solve();
        }
        return 0;
    }                
  • 相关阅读:
    全选+批量删除
    ssm异步上传图片
    抽象类与接口区别
    请求转发和重定向区别
    switch
    一道有点绕弯,考察的知识也是最基础的题
    线程安全之集合
    会话跟踪技术
    关于异常说明
    mybatis总结(三)之多表查询
  • 原文地址:https://www.cnblogs.com/jianfengyun/p/3731389.html
Copyright © 2011-2022 走看看