题目----汽水问题

简介: 题目----汽水问题

题目

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水?

解析

这个问题是一个典型的递归问题,可以通过计算购买和回收空瓶的过程来解决。让我们逐步分析:

初始购买: 你有20元,每瓶汽水1元,所以最开始你可以买20瓶汽水。

回收空瓶: 喝掉这20瓶汽水后,你有20个空瓶。每2个空瓶可以换一瓶汽水,所以你可以用这些空瓶换10瓶汽水。

继续回收: 喝掉这10瓶汽水后,你又有10个空瓶。同样的规则,你可以换5瓶汽水。

重复过程: 继续这个过程,你每次喝完汽水后回收空瓶以换取更多的汽水。

我们可以一直这样继续下去,直到没有足够的空瓶可以换取更多的汽水。每一步中,你获得的汽水数量等于你拥有的空瓶数量除以2(向下取整)。

现在,让我们来计算一下总共可以喝多少汽水。

给20元,你总共可以喝39瓶汽水。

这个结果是通过不断回收并利用空瓶来换取更多的汽水得出的。初始阶段,你直接购买20瓶汽水。随后,通过回收这些空瓶,你能够逐渐换取更多的汽水,直到没有足够的空瓶可以进行更多的交换为止。

那么该题的算法逻辑梳理出来过后,我们将其写入代码中:

代码跟写

/*
思路:
1. 20元首先可以喝20瓶,此时手中有20个空瓶子
2. 两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子)
3. 如果瓶子个数超过1个,可以继续换,即重复2
*/
int main()
{
  int money = 0;
  int total = 0;
  int empty = 0;
 
 
  scanf("%d", &money);
  
  //方法1
  total = money;
  empty = money;
  while(empty>1)
  {
    total += empty/2;
    empty = empty/2+empty%2;
  }
 
    printf("total = %d\n", total);
  return 0;
}
 
 
// 方法二:按照上述喝水和用瓶子换的规则的话,可以发现,其实就是个等差数列:money*2-1
int main()
{
  int money = 0;
  int total = 0;
  int empty = 0;
 
 
  scanf("%d", &money);
  
  //方法2
  if(money <= 0)
  {
    total = 0;
  }
  else
  {
    total = money*2-1;
  }
  printf("total = %d\n", total);
 
 
  return 0;
}
目录
相关文章
|
6月前
|
算法
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
【动态规划专栏】专题三:简单多状态dp--------2.打家劫舍II
52 0
|
6月前
|
存储 索引
题目----LeeCode热题100--1 两数之和
题目----LeeCode热题100--1 两数之和
43 1
|
3月前
|
存储
LeetCode------递归(爬楼梯)
这篇文章通过LeetCode上的"爬楼梯"问题介绍了递归的基本概念和实现方法,包括递归公式的推导、基本递归实现、使用备忘录优化以避免重复计算,以及自底向上的迭代方法来提高效率。
LeetCode------递归(爬楼梯)
|
6月前
题目----逆序
题目----逆序
27 0
动态规划之----01背包题目解析
动态规划之----01背包题目解析
78 0
|
6月前
力扣每日一题 ---- 2918. 数组的最小相等和
力扣每日一题 ---- 2918. 数组的最小相等和
|
图计算 索引 容器
leetcode100----双指针
leetcode100----双指针
|
C语言
Leetcode---爬楼梯
Leetcode---爬楼梯
31 0