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