hdoj fatmouse(贪心算法入门)

FatMouse’ Trade

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20968    Accepted Submission(s): 6501

Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.

The warehouse has N rooms. The i-th room contains J[i] pounds of JavaBeans and requires F[i] pounds of cat food. FatMouse does not have to trade for all the JavaBeans in the room, instead, he may get J[i]* a% pounds of JavaBeans if he pays F[i]* a% pounds of cat food. Here a is a real number. Now he is assigning this homework to you: tell him the maximum amount of JavaBeans he can obtain.  

 

Input The input consists of multiple test cases. Each test case begins with a line containing two non-negative integers M and N. Then N lines follow, each contains two non-negative integers J[i] and F[i] respectively. The last test case is followed by two -1’s. All integers are not greater than 1000.  

 

Output For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain.  

 

Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1  

 

Sample Output 13.333 31.500  

 

Author CHEN, Yue  

 

Source
ZJCPC2004  

 

Recommend JGShining 一开始我没有想到用结构体来表示。程序快要敲完的时候发现记录比率的数组没法记录容纳量,无法F[i]* a。 于是我就在网上搜了有关的答案,用的是结构体。答案如下:

#include <iostream>

#include<algorithm>

#include <iomanip>

using namespace std;

const int MAXN=1010;

struct node

{

    int J,F;

    float ratio1;

}a[MAXN];

bool cmp(node a,node b)

{

    return a.ratio1>b.ratio1;

}

int main()

{

    int m,n,i=0,j;

    float sum;

    while (cin>>m>>n&&m!=-1)

    {

        sum=0;

        i=0;

        for (j=0;j<n;j++)

        {

            cin>>a[i].J>>a[i].F;

            a[i].ratio1=(float)a[i].J/a[i].F;

            i++;

        }

        sort(a,a+n,cmp);

        for (i=0;i<n;i++)

        {

            if (m>=a[i].F)

            {

                sum+=a[i].J;

                m-=a[i].F;

            }

            else

            {

                sum+=a[i].ratio1*m;

                break;

            }

        }

        cout<<fixed<<setprecision(3)<<sum<<endl;

    }

    return 0;

}

后来想了一下其实也可以不用结构体,就是在得到比率的同时对原来的数组进行排序,以达到计算是否超出容量的目的。

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/bbtl_ast/article/details/53643780
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞