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