某学院有m个学生参加春游,休息时喝汽水。商家公告:
- 买一瓶汽水定价1.40元,喝一瓶汽水(瓶不带走)1.00元。
- 为节约资源,规定3个空瓶可换回一瓶汽水,或20个空瓶可换回7瓶汽水。
- 为方便顾客,可先借后还。例如借一瓶汽水还3个空瓶,或借七瓶汽水还20个空瓶
问:
- m个学生每人喝一瓶汽水(瓶不带走),至少需要多少元?
- 输入正整数m,输出至少需要多少元(精确到小数点后第二位)
解题思路:
注意到春游喝汽水无需带走空瓶,根据商家的规定作以下比较:
1)如果人数为20人,买13瓶汽水,借7瓶汽水,饮完20瓶汽水后还20个空瓶(相当于换回7瓶汽水还给商家),两清。此时每人花费为
13/20*1.40 = 0.91 元
2)如果人数为3人,买2瓶汽水,借 1 瓶汽水,饮完3瓶汽水后还3个空瓶(相当于换回1瓶汽水还给商家),两清。此时每人花费为:
2/3*1.40 = 0.93 元
3)如果只有2人或1人,每人喝一瓶汽水(瓶不带走),此时每人花费1元。
4)注意到0.91<0.93<1,因而有以下的最省钱算法:
a. 把m人分为x=m/20个大组,每组20个人。每组买13瓶汽水(借7瓶汽水),饮完后还20个空瓶,两清。
b. 剩下t = m - x20人,分为y = t/3个小组,每组3人。每组买两瓶汽水(借一瓶汽水),饮完后还3个空瓶,两清。
c. 剩下t = m - x20-y*3 人,每人花1元喝1瓶。
通过该算法得所花费用最低为:
(13x+2y)*1.4+t 元
程序设计
#include <stdio.h>
int main()
{
long m, t, x, y;
printf(" 请输入人数 m :>_ ");
scanf("%ld", &m);
x = m / 20;
t = m - 20 * x;
y = t / 3;
t = m - 20 * x - 3 * y;
printf(" 喝 %ld 瓶汽水,至少需要 %.2f 元。\n", m, (13 * x + 2 * y)*1.40 + t);
return 0;
}
程序运行示例:
以上最值求解没有设置循环,通过简单比较之后的分组思路是设计求解的关键。