zoukankan      html  css  js  c++  java
  • 牛客网 2018年东北农业大学春季校赛 I题 wyh的物品

    链接:https://www.nowcoder.com/acm/contest/93/I

    来源:牛客网

    时间限制:C/C++ 5秒,其他语言10秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的k个物品的总价值和总重量的比值)

    输入描述:

    输入第一行一个整数T(1<=T<=10)
    接下来有T组测试数据,对于每组测试数据,第一行输入两个数n和k(1<=k<=n<=100000)
    接下来有n行,每行两个是a和b,代表这个物品的重量和价值

    输出描述:

    对于每组测试数据,输出对应答案,结果保留两位小数
    示例1

    输入

    13 22 25 32 1

    输出

    0.75

    说明

    对于样例来说,我们选择第一个物品和第三个物品,达到最优目的

    思路:

    本题需要用到二分思想:

            二分的对象为我们所求的结果:最大的单位价值z,假定最大的单位价值为Z(这里用大写表示),我们选取了正确的k件商品,那么,这k件商品的质量之和,乘上单位价值Z,一定会等于这k件商品的价值之和。在二分的过程中,如果k件商品的质量之和,乘上单位价值z,小于了k件商品的价值之和,那么说明,这现在的单位价值偏小,反之,则偏大。

            那么,我们应该要如何选取正确的k件商品呢?对于单个的商品而言,单位价值z乘上商品的质量,就是这件商品在这个单位价值z下,所要达到的价值,而很明显,这个乘出来的价值,一般与实际价值不相等。假定乘出来的价值为u,实际价值为v,如果u>v,则说明这件商品,没有达到正确的k件商品的平均值。如果一共有k件这样的商品,每一件商品的v-u之和,如果z正确,应该是等于0的。那么,究竟如何选取正确的k件商品呢?只需要选择v-u最大的k件商品即可。如果v-u之和小于0,则说明我们的z取得大了。

    AC代码如下

    #include<cstdio>
    #include<algorithm>
    #define eps 1e-6
    int n,k;
    struct node
    {
        int u;
        int v;
        double x;
    }a[100086];
    bool jud(struct node a,struct node b)
    {
        return a.x>b.x;
    }
    
    bool haha(double mid)
    {
        for(int i=0;i<n;i++){
            a[i].x=1.0*a[i].v-a[i].u*mid;
        }
        std::sort(a,a+n,jud);
        double ans=0;
        for(int i=0;i<k;i++){
            ans+=a[i].x;
            if(ans<0) return false;
        }
        return true;
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        for(int o=0;o<T;o++){
            scanf("%d%d",&n,&k);
            for(int i=0;i<n;i++){
                scanf("%d%d",&a[i].u,&a[i].v);
            }
            double l=0.0,r=100000.0;
            double mid;
            while(r-l>eps)
            {
                mid=(l+r)/2;
                if(haha(mid)){
                    l=mid;
                }
                else {
                    r=mid;
                }
            }
            printf("%.2lf
    ",mid);
        }
    }
    


  • 相关阅读:
    【json的处理】一、Gson处理
    【校验处理】三、Spring Validation 校验处理
    【校验处理】二、SpringBoot Validate 统一处理
    【校验处理】一、Java Bean Validation验证
    div 固定宽高 水平垂直居中方法
    vue 修改ElementUI样式(非全局修改)
    js --- execCommand('copy')复制文本到剪切板换行符不生效
    C#枚举(一)使用总结以及扩展类分享
    php执行时长
    关于PHP的编码格式导致的乱码
  • 原文地址:https://www.cnblogs.com/ZGQblogs/p/9380875.html
Copyright © 2011-2022 走看看