HDOJ 1009

贪心问题,但要注意一些特殊数据:
尤其是M=0,与F==0时的情况。
0 1
1 0
1.000
1 0
0.000
5 4
10000 5
2000 2
100 0
300 0
10400.000
数据类型用double,就这样



#include <iostream>
#include <algorithm>
#include <iomanip>

using namespace std;

struct jf
{
    double a;
    double b;
    double c;
}JF[1005];

int cmp_jf(const void *a,const void *b)
{
    if(((jf*)a)->c-((jf*)b)->c>1e-6)  return -1;
    else return 1;
}

int main()
{
    double M,N;
    cin>>M>>N;
while(M!=-1||N!=-1)
{
    for(int i=0;i<N;i++)
    {
        cin>>JF.a>>JF.b;
        if(JF.b==0) JF.c=999999999;
        JF.c=JF.a/JF.b;
    }

    qsort(JF,N,sizeof(JF[0]),cmp_jf);

    double sum=0;
    for(int i=0;i<N;i++)
    {
        if(JF.b==0)
        {
            sum=sum+JF.a;
        }
        if(M>1e-6)
        {
             if(M>=JF.b&&JF.a-JF.c*JF.b>1e-6)
             {
                 M=M-JF.b;
                 sum=sum+JF.c*JF.b;

                // cout<<"sum1:"<<sum<<endl;
             }
             else if(M>=JF.b&&JF.a-JF.c*JF.b<=1e-6)
             {
                 double B=JF.a/JF.c;
                 M=M-B;
                 sum=sum+JF.a;

                // cout<<"sum2:"<<sum<<endl;
             }
             else if(M<JF.b&&JF.a-JF.c*M>=1e-6)
             {
                 sum=sum+JF.c*M;
                 M=M-M;

               //  cout<<"sum3:"<<sum<<endl;
             }
             else if(M<JF.b&&JF.a-JF.c*M<=1e-6)
             {
                 double B=JF.a/JF.c;
                 M=M-B;
                 sum=sum+JF.a;

               //  cout<<"sum4:"<<sum<<endl;
             }
        }
        else break;
    }
    cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(3)<<sum<<endl;
    cin>>M>>N;
}
    return 0;
}

posted @ 2013-03-05 06:48  码代码的猿猿  阅读(190)  评论(0编辑  收藏  举报