描述
小老鼠准备了 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;
}