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;
}


550

被折叠的 条评论
为什么被折叠?



