NYOJ 914 Yougth的最大化

来源:互联网 发布:美国国父路易十六知乎 编辑:程序博客网 时间:2024/06/05 08:57

题目链接
第一次遇到二分法和贪心结合的题目,算法很妙,把中间值输出理解了一下,大概是保证有解的情况下,通过二分法使单位重量的价值最大,还运用了一个结论,就是多个物品单位重量的价值一定小于单位重量价值最大的物品,我想这也许可以算一个模板题了吧,,有的写法只能先记住了。
代码出自别人,结论证明思路及代码
如下代码链接
感觉这个代码更容易理解一些

#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;}
0 0
原创粉丝点击