当前位置:   article > 正文

牛客网力扣算法编程之四 | 数学模拟 - 汽水瓶-Java代码实现_力扣中空汽水瓶换汽水

力扣中空汽水瓶换汽水

【算法编程】汽水瓶

一. 题目描述

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

    数据范围:输入的正整数满足 1≤n≤100

    注意:本题存在多组输入。

    允许如题面所述向老板借汽水。

    输入的 0 仅表示输入结束,并不用输出结果

输入描述:

        输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。

输出描述:

        对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

示例1

输入:

3
10
81
0

输出:

1
5
40

说明:

样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换
样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一瓶汽水喝完得三个空瓶换一瓶汽水还给老板

 二. 解题思路总结:

1. 定义一个长度为10的数组,res[i]接收第i个输入得到的结果

2. 如果某行输入为0,不再继续往下执行,程序结束;

3. 如果输入为2,可以找老板GG借一瓶,喝完后连同自己的两个空瓶子一起换一瓶,还给老板GG;

4. 如果输入是1或者3,对应的res[k]为in/3,结果为-1和1. -1作为最后特殊处理,重新赋值为0.

5.如果是4瓶,可以先除以3,找老板换一瓶后,喝完连同剩余的空瓶一共有2个空瓶,找老板借一瓶,喝了后换回来一瓶还给他;

6. 如果有4瓶以上,循环除以3(3个空瓶换一瓶),更新in的值为换回来喝完后,与余数(凑不齐3个的剩余空瓶)相加

7. in没到0,1,2,则继续循环(如果in取最大值100,in更新为33+1,继续循环34/3, in在第二轮循环就更新为11+1,第三轮循环则in=4,第四轮循环就搞定了,所以j到不了10就会break出去)

8. 如果in=2,找老板借一瓶,喝了后还他,还可以蹭一瓶res[k]++。

9. 如果in更新后的值是0,1时,表明已处理完,没法找老板换了break出去.

10. 处理完一个输入,则k++, while循环中判断k是否小于10,因为最多接收10组输入。

11. 用65535标识除有效输入外,res[i]没有用到的数字,默认为0 ,给他改成65535

12. 输出不为65535的res[i],如果输入为1, res[i]为0, 也应该输出。

三. Java代码如下:

  1. import java.util.*;
  2. public class Main {
  3.   public static void main(String[] args) {
  4.         Scanner sc = new Scanner(System.in);
  5.         int k = 0;
  6.         int[] res = new int[10];     //定义一个长度为10的数组,res[i]接收第i个输入得到的结果
  7.          while(sc.hasNextLine()&&k<10){
  8.             String str = sc.nextLine();
  9.                 int in = Integer.parseInt(str);
  10.                     if (in == 0) break;     //如果某行输入为0,不再继续往下执行,程序结束。
  11.                     if (in == 2) res[k] = (in + 1) / 3;   //如果输入为2,可以找老板GG借一瓶。
  12.                     if ( in == 3) res[k] = in / 3; //如果输入是1或者3,对应的res[k]为in/3,结果为-11.
  13.                     if (in == 1) res[k]=-1;
  14.                   
  15.                    if (in == 4) {       //如果是4瓶,可以先除以3,找老板换一瓶喝了后还给他
  16.                         res[k] = in / 3;
  17.                         int x = in / 3 + in % 3 + 1;
  18.                         res[k] = res[k] + x / 3;
  19.                     }
  20.                     if (in > 4) {    //如果有4瓶以上,循环除以33个空瓶换一瓶),更新in的值
  21.                         for (int j = 0; j < 10; j++) {   //in没到0,1,2,则继续循环
  22.                             res[k] = res[k] + in / 3;
  23.                             in = in / 3 + in % 3;    
  24.                             if (in == 2) {       //如果in=2,找老板借一瓶,喝了后还他,蹭一瓶res[k]++。 
  25.                                 res[k]++;
  26.                                 in = 0;
  27.                                 break;
  28.                             }
  29.                             if (in == 0 || in == 1) break;  //如果in更新后的值是0,1时,已处理完,break.
  30.                                               
  31.                         }
  32.                     }
  33.                     k++;    // while循环中判断k是否小于10,因为最多接收10组输入。
  34.                 }        
  35.         for (int i = 0; i < k; i++) {
  36.                if(res[i]==0)
  37.                    res[i]=65535;        //65535标识除有效输入外,res[i]的数字
  38.                if(res[i]==-1) res[i]=0;
  39.             }
  40.         for (int i = 0; i < k; i++) {
  41.              if(res[i]!=65535)
  42.                  System.out.println(res[i]);   //输出不为65535的res[i],如果输入为1, res[i]为0
  43.         }
  44.       }
  45.     }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序诗人2/article/detail/62820
推荐阅读
相关标签
  

闽ICP备14008679号