NYOJ-914 Yougth的最大化

    xiaoxiao2021-04-16  33

    时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 4 描述

    Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?

    输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。 (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使得单位价值的最大值。(保留两位小数) 样例输入 3 2 2 2 5 3 2 1 样例输出 0.75 //这道题一定要注意好贪心的策略 #include <stdio.h> #include <algorithm> #define epu 1e-3 using namespace std; void result(); bool greddy(double mid); int n,c; struct Data{     double vi;     double wi; }a[10005]; double sum[10005]; double m; int main() {     double vi,wi;     int i;     while(scanf("%d%d",&n,&c)!=EOF)     {         m=0.0;         for(i=0;i<n;i++)         {             scanf("%lf%lf",&a[i].wi,&a[i].vi);             if(a[i].vi/a[i].wi>m)                 m = a[i].vi/a[i].wi;         }         result();     }     return 0; } void result() {     double left=0.0;     double right=m;     double mid; //    while(right-left>epu) //    { //        mid=(right+left)/2; //        if(greddy(mid)) //            left=mid; //        else //            right=mid; //    } //    printf("%.2lf\n",left);     while(left<=right)     {         mid=(right+left)/2;         if(greddy(mid))             left=mid+0.001;         else             right=mid-0.001;     }     printf("%.2lf\n",right); } bool greddy(double mid) {     int i,j,cnt=0;     double s=0.0;     for(i=0;i<n;i++)         sum[i]=a[i].vi-a[i].wi*mid;     sort(sum,sum+n);     for(i=0;i<c;i++)         s += sum[n-i-1];     if(s>=0)//每个个体的价值 与 个体*单位价值 差的 和>=0时,说明找到的这个单位价值符合条件         return true;     else         return false; }
    转载请注明原文地址: https://ju.6miu.com/read-672774.html

    最新回复(0)