杭电OJ——1009题

1009:肥鼠准备了 M 磅猫粮,准备和守卫仓库的猫交换他最喜欢的食物 JavaBean。
仓库有 N 个房间。第 i 个房间包含 J [i] 磅 JavaBeans,需要 F [i] 磅猫粮。FatMouse 不必交易房间里所有的 JavaBeans,相反,如果他支付 F [i]*a% 磅猫粮,他可能会得到 J [i]*a% 磅 JavaBeans。这里 a 是一个实数。现在他正在给你布置这个作业:告诉他可以获得的 JavaBeans 的最大数量。

 输入:由多个测试用例组成。每个测试用例以包含两个非负整数 M 和 N 的行开始。然后是 N 行,每行分别包含两个非负整数 J [i] 和 F [i]。最后一个测试用例后面跟着两个 - 1。所有整数都不大于 1000。

输出:对于每个测试用例,在一行中打印一个精确到小数点后 3 位的实数,这是 FatMouse 可以获得的最大 JavaBean 数量。

示例输入:  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 <string.h>

int main()

{

    int M, N;

    while (scanf("%d %d", &M, &N)!= EOF)

    {

        if (M == -1 && N == -1)

        {

            return 0;

        }

        double J[1000] = {0}, F[1000] = {0};

        double sum = 0.0;

        int i, j, t;

        // J[i]和F[i]读取出来

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

        {

            scanf("%lf %lf", &J[i], &F[i]);

        }

        // 按照 J[i]/F[i] 非递增排序

        for (i = 0; i < N - 1; i++)

        {

            for (j = 0; j < N - i - 1; j++)

            {

                if ((J[j] / F[j]) < (J[j + 1] / F[j + 1]))

                {

                    double tempJ = J[j];

                    double tempF = F[j];

                    J[j] = J[j + 1];

                    F[j] = F[j + 1];

                    J[j + 1] = tempJ;

                    F[j + 1] = tempF;

                }

            }

        }

        // 采用贪心进行计算

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

        {

            if (M == 0)

            {

                break;

            }

            if (M >= F[i])

            {

                sum += J[i];

                M -= F[i];

            }

            else

            {

                sum += J[i] * ((double)M / F[i]);

                M = 0;

                break;

            }

        }

        //输出结果

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

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值