九度OJ 1433 FatMouse -- 贪心算法

题目地址:http://ac.jobdu.com/problem.php?pid=1433

 

题目描述:

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.

输入:

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.

输出:

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.

样例输入:
5 3

7 2

4 3

5 2

20 3

25 18

24 15

15 10

-1 -1
样例输出:
13.333

31.500
#include <stdio.h>

#include <stdlib.h>

 

typedef struct fj{

    int food;

    int javabean;

    double rate;

}FtoJ;

 

int compare(const void * p, const void * q){

    FtoJ * p1 = (FtoJ *)p;

    FtoJ * q1 = (FtoJ *)q;

    if (p1->rate - q1->rate > 0) return -1;

    if (p1->rate - q1->rate == 0) return 0;

    if (p1->rate - q1->rate < 0) return 1;

}

 

int main(void){

    int m, n;

    FtoJ trade[1000];

    int i;

    double sum;

 

    while ((scanf ("%d %d", &m, &n) != EOF) && (m != -1) && (n != -1)){

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

            scanf ("%d %d", &trade[i].javabean, &trade[i].food);

            trade[i].rate = (double)trade[i].javabean / (double)trade[i].food;

        }

        qsort (trade, n, sizeof(FtoJ), compare);

        i  = 0;

        sum = 0;

        while (m > 0 && i<n){

            if (m >= trade[i].food){

                sum += (double)trade[i].javabean;

                m -= trade[i].food;

            }

            else{

                sum += (double)trade[i].javabean * ((double)m / (double)trade[i].food);

                m = 0;

            }

            ++i;

        }

        printf ("%.3lf\n", sum);

    }

 

    return 0;

}

 


 

你可能感兴趣的:(贪心算法)