NYOJ 914 Yougth的最大化

来源:互联网 发布:linux poll 编辑:程序博客网 时间:2024/05/16 01:29

Yougth的最大化

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

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

输入
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
输出使得单位价值的最大值。(保留两位小数)
样例输入
3 22 25 32 1
样例输出
0.75
来源
Yougth
上传者

TC_杨闯亮



贪心加上二分法


#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int w[12000],v[12000];double total[12000];int n,k;bool deal(double num){    int i;    double sum=0;    for(i=0;i<n;i++){        total[i]=v[i]-num*w[i];        //printf("%lf ",total[i]);    }    //printf("\n");    sort(total,total+n);    for(i=0;i<k;i++){        sum+=total[n-1-i];        //printf("%lf\n",sum);    }    if(sum>=0)        return true;    else        return false;}double reach(double end){    int i;    double l=0,r=end,mid;    for(i=0;i<100;i++){        mid=(l+r)/2;        //printf("%lf\n",mid);        if(deal(mid))           l=mid;        else           r=mid;    }    return l;//返回一个左端点 }int main(){    double max,temp;    int i;    while(~scanf("%d%d",&n,&k)){        max=0;        for(i=0;i<n;i++){            scanf("%d %d",&w[i],&v[i]);               temp=v[i]/w[i];               if(temp>max)                  max=temp;        }        printf("%.2lf\n",reach(max));    }    return 0;}

最优解


#include <cstdio>#include <algorithm>#include <cmath>const double exps = 1e-3;//10的-3次方 struct node{    int v,w;//v是价值 w是重量     double c;}p[10010];int n,k;bool cmp(const node &x,const node &y){    return x.c > y.c;//按照c从大到小进行排列 }double test(){    double ans,tmp = 0;    int x,y;    while(true){        ans = tmp;        for(int i = 0; i < n; i++)    p[i].c = p[i].v - ans*p[i].w;//这玩意算的是什么?         std::sort(p,p+n,cmp);        x = y = 0;        for(int i = 0; i < k; i++){            x += p[i].v;            y += p[i].w;        }        tmp = x*1.0/y;//单位重量的价格         if(fabs(tmp - ans) < exps)//如果这次的值减去上次的值小于exps  return ans;    }}int main(){    while(~scanf("%d %d",&n,&k)){        for(int i = 0; i < n; i++)        scanf("%d %d",&p[i].w,&p[i].v);        printf("%.2f\n",test());    }    return 0;}        


原创粉丝点击