我爱编程(c语言)

描述

小老鼠准备了 M 磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。

仓库有 N 个房间,第 i 个房间有 J[i] 磅的五香豆,并且需要用 F[i] 磅的猫粮去交换。

老鼠不必交换该房间所有的五香豆,换句话说,它可以用 F[i] * a% 磅的猫粮去换取 J[i] * a% 磅的五香豆,其中 a 是一个实数。

输入

输入包含多组测试用例,每组测试数据首先一行是 2 个非负整数 M 和 N,接着的 N 行,每行分别包含 2 个非负整数 J[i] 和 F[i]。

输入数据以两个 -1 结束。

题目保证所有的数据不超过 1000。

输出

请计算并输出小老鼠最多能够得到的五香豆数量。

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int wxd;  // 五香豆数量
    int ml;   // 猫粮数量
    double dj; // 单价
} sd;

int cmp(const void *a, const void *b)
{
    double diff = ((sd *)b)->dj - ((sd *)a)->dj;
    if (diff > 0) return 1;
    else if (diff < 0) return -1;
    else return 0;
}

int main()
{
    int M, N;
    while (scanf("%d %d", &M, &N) != EOF && M != -1 && N != -1)
    {
        sd a[N];
        for (int i = 0; i < N; i++)
        {
            scanf("%d %d", &a[i].wxd, &a[i].ml);
        }
        for (int i = 0; i < N; i++)
        {
            a[i].dj = (double)a[i].wxd / a[i].ml;
        }
        qsort(a, N, sizeof(sd), cmp);
        int summoney = M;
        double sumwxd = 0;
        for (int i = 0; i < N; i++)
        {
            if (summoney <= a[i].ml)
            {
                sumwxd += summoney * a[i].dj;
                break;
            }
            else
            {
                sumwxd += a[i].wxd;
                summoney -= a[i].ml;
            }
        }
        printf("%.3lf\n", sumwxd);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值