HDU 1009 FatMouse' Trade

来源:互联网 发布:bot的知识图谱数据api 编辑:程序博客网 时间:2024/06/16 13:36

题目链接:HDU1009

     题目是一道简单的贪心问题,但是一点需要注意:

排序kase[i].j/kase[i].f的时候需要考虑kase[i].f为0的情况,也就是说代价为0,此时比值应该为无穷大,但是j,f二者皆为double型变量,比值在f极小的情况下也可以接近无穷大,如果置j=0时比值为一个很大的值如 1e9,也不能满足条件。故考虑将j=0单独拿出来考虑,仅对j!=0的情况进行贪心。

代码:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;#define INF 1e50#define maxn 1000struct warehouse{    double f,j,unit_price;}Kase[maxn];bool  cmp(warehouse x,warehouse y){    if(x.unit_price>=y.unit_price) return true;    else return false;}int main(){    double m;int n;    while(scanf("%lf%d",&m,&n))    {        if(m==-1&&n==-1)break;        double sum=0;        int i,k;        for(k=i=0;i<n;i++)           {               scanf("%lf%lf",&Kase[k].j,&Kase[k].f);               if(Kase[k].j){Kase[k].unit_price=Kase[k].j/Kase[k].f;k++;}               else {sum+=Kase[k].j;}           }           sort(Kase,Kase+k,cmp);           double left=m;           for(int i=0;i<k;i++)          {             if(left>=Kase[i].f)             {                 left-=Kase[i].f;                 sum+=Kase[i].j;              }              else              {                  sum+=(double)left/Kase[i].f*Kase[i].j;                  left=0;break;              }          }           printf("%.3lf\n",sum);    }}
0 0