代码改变世界

HDU1009——FatMouse' Trade

2009-04-25 23:02  Logic0  阅读(410)  评论(0编辑  收藏  举报
我顶 字号:

http://acm.hdu.edu.cn/showproblem.php?pid=1009

 

贪心,按照j[i]/f[i]从大到小排序,依次贪心选择即可。这里判断了f[i]为0的情况。

 

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct

{

    long
j,f;
    double
p;
}
NODE;
bool
compare(NODE a,NODE b)
{

    return
a.p > b.p;
}

int
main()
{

    long
m,n;
    cin>>m>>n;
    vector<NODE> s;
    while
(m!=-1&&n!=-1)
    {

        int
i;
        NODE tmp;
        for
(i= 1;i<=n;i++)
        {

            cin>>tmp.j>>tmp.f;
            if
(tmp.f == 0)
                tmp.p = 1001.0;
            else

                tmp.p = (double)tmp.j/tmp.f;
            s.push_back(tmp);
        }

        sort(s.begin(),s.end(),compare);
        vector<NODE>::iterator mb = s.begin();
        double
res = 0.0;
        while
(m>0 && mb!=s.end())
        {

            if
((*mb).f <= m)
            {

                 res += (*mb).j;
                 m -= (*mb).f;
            }

            else

            {

                 res += (double)m / (*mb).f * (*mb).j;
                 m = 0;
                 break
;
            }

            mb++;
        }

        s.clear();
        printf("%.3lf\n",res);
        cin>>m>>n;
        res = 0.0;
    }

    return
0;
}

有个很诡异的问题,不知道为什么,tmp.p = (double)tmp.j/tmp.f;写成tmp.p = (double)tmp.j/(double)tmp.f;就会WA。至今不知道为什么,有待研究。