空瓶子换水问题

近期看到有个有趣的问题,我简称为“空瓶子换水”问题,这里分两种情况,一种是有空瓶子,直接换水问题;另一种是知道怎么用空瓶子换水,如果满足一定数量的人喝水,需要至少买多少瓶问题。

这里假设3个空瓶子可以换1瓶水,那么针对上面的两个问题,有如下解释。

1. 有空瓶子,直接换水

对于计算方法,我这里提供两种,

第一种是比较笨拙的方法,假设有100个空瓶子,那个第一次换的为50,然后喝完再换,知道不能继续换为止。那么结果为:33+11+4+1=49;

第二种是,有M个空瓶子,N个瓶子可以换一瓶水(不是一瓶问题,要转换为一瓶问题),那么他可以换的瓶数为小于M/(N-1)的最大整数。针对第一种的情况,小于(100/(3-1))的为49.

2. 满足M人很水,需要买多少瓶


这里也有两种方法,和第一种情况有点类似,只是需要先买M瓶,再来换。这里假设满足100人喝水,需要至少买多少瓶。

第一种方法,穷举的方法,从估计的某个数开始尝试,直到找到符合的结果,代码如下:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#include<stdio.h>

int LeastNum(int
base, int
peopleNum, int
begin)

{

    int
res=0,temp;

    int
temp_res,exchange;

    for(int
i=begin; i<peopleNum; i++)

    {

        temp = i;

        temp_res = i;

        while(temp >= base)

        {

            exchange = temp / base;

            temp_res = temp_res + exchange;

            temp = exchange + temp % base;

        }

        if(temp_res >= peopleNum)

        {

            res = i;

            break;

        }

    }

    return
res;

}

void
main()

{

    // 商店做活动,3个空瓶可以换一瓶水,100个人同时去买水,请问至少需要买多少瓶水才能保证每个人都有一瓶水喝

    int
base, peopNum;

    scanf_s("%d %d",&base, &peopNum);

    printf("The minimum purchaing count is %d \n",LeastNum(base,peopNum,60)); //我这里从60开始,也可以从1开始

}

第二种方法,和第一种情况第二种方法有些类似,可采用公式(X+(X/(N-1)))=M,这里X为需要购买的瓶数,最后求出的为大于X的最小正整数。正对满足100人问题,求出结果为66.7,那么最少需要买67瓶。


空瓶子换水问题,布布扣,bubuko.com

时间: 2024-10-12 16:37:20

空瓶子换水问题的相关文章

华为往年笔试题【空瓶子换水喝】

题目:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 自己的笨解法: 1 #include<iostream> 2 #include<math.h> 3

空瓶子换可乐

 题目: Once upon a time, there is a special coco-cola store. If you return three empty bottles to the shop,you’ll get a full bottle of coco-cola to drink. If you have n empty bottles right in your hand, how manyfull bottles of coco-cola can you drink?

C# 酒鬼买酒喝,瓶盖和空瓶子可以换新的酒

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 换瓶子 { class Program { //2元钱1瓶子 //4个瓶盖换1瓶 //2个空瓶子换1瓶 //现在有10元钱,可以喝到几瓶 static void Main(string[] args) { int drinkCount =

1块钱一瓶水,4个盖子换一瓶水,150块能喝多少水

先来分析一下: 第一次:150 第二次:150 / 4 = 37 ······2 第三次:(37+2)/ 4 = 9······3 第四次:(9 + 3) / 4 = 3 3 < 4 所以停止 初始值150瓶水,也就是150个盖子 1.拿所有的盖子去换水,纪录余数和sum 2.(上次的余数+上次换水喝剩的盖子数)/4,纪录余数和sum1 …… 无限循环,直到盖子数<4,, 结合代码: public class Demo3 { public static void main(String[] a

养鱼“好水”的定义

http://longyu.cc/forum.php?mod=viewthread&tid=122021&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1 养鱼“好水”的定义 究竟什么样的水是养鱼的“好水”每个养鱼人都有自己的看法,做为一个合格的养鱼人,应该对养鱼的水有一个全面客观的认识和理解,那么到底什么样的水是养鱼的好水呢?怎么通过感官判断和检测手段来判定好水呢?我将在这篇文章里做一个全面详细的阐述. 我定义的好水应该

开新缸养水全攻略

近来很多朋友都在发帖问,我开缸应该注意什么,开缸的步骤是什么,怎么能养好一缸水.诸位高手也在百问不烦孜孜不倦的解答,我总结了一下自己的一些经验一.器材的前期准备一个鱼缸首先要有器材,器材都包括以下几件,咱们以淡水缸为本体进行总结.1.过滤系统,可以是上滤,底缸过滤,侧滤,背滤,这些介绍论坛里无数了,大家可以去参考一下,来做自己最合适的过滤系统.  2.滤材.滤材的种类比较多,不过常用的总结下来只有几样,过滤棉或者是生化棉,生化球,细菌屋,火山石,麦饭石,珊瑚石,活性炭和玻璃环.过滤棉和生化棉是不

[算法]: 递归-空瓶换饮料

一瓶饮料1块钱,2个空瓶子换一瓶饮料,问:一定钱数最多喝多少瓶饮料 def drink_coke(money, empty_bottle=0): actual_money = money if money % 2 != 0: empty_bottle += 1 if empty_bottle == 2: actual_money += 1 empty_bottle = 1 if money == 0 : return actual_money return actual_money + drin

湖南省第六届大学生计算机程序设计竞赛---汽水瓶

1006: 汽水瓶 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 3 [提交][状态][讨论版] 题目描写叙述 有这样一道智力题:"某商店规定:三个空汽水瓶能够换一瓶汽水.小张手上有十个空汽水瓶.她最多能够换多少瓶汽水喝?"答案是5瓶,方法例如以下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子. 然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.假设小张手上有n

huawei 三套题

链接:https://www.nowcoder.com/questionTerminal/fe298c55694f4ed39e256170ff2c205f 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小