逻辑题 | 喝 m 瓶汽水至少需要多少钱?

某学院有m个学生参加春游,休息时喝汽水。商家公告:

  1. 买一瓶汽水定价1.40元,喝一瓶汽水(瓶不带走)1.00元。
  2. 为节约资源,规定3个空瓶可换回一瓶汽水,或20个空瓶可换回7瓶汽水。
  3. 为方便顾客,可先借后还。例如借一瓶汽水还3个空瓶,或借七瓶汽水还20个空瓶

问:

  1. m个学生每人喝一瓶汽水(瓶不带走),至少需要多少元?
  2. 输入正整数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 - x
20-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;
}

程序运行示例:
在这里插入图片描述

以上最值求解没有设置循环,通过简单比较之后的分组思路是设计求解的关键。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值