牛客网力扣算法编程之四 | 数学模拟 - 汽水瓶-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代码如下:

import java.util.*;
public class Main {
  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = 0;
        int[] res = new int[10];     //定义一个长度为10的数组,res[i]接收第i个输入得到的结果
         while(sc.hasNextLine()&&k<10){
            String str = sc.nextLine();
                int in = Integer.parseInt(str);
                    if (in == 0) break;     //如果某行输入为0,不再继续往下执行,程序结束。
                    if (in == 2) res[k] = (in + 1) / 3;   //如果输入为2,可以找老板GG借一瓶。
                    if ( in == 3) res[k] = in / 3; //如果输入是1或者3,对应的res[k]为in/3,结果为-1和1.
                    if (in == 1) res[k]=-1;
                  
                   if (in == 4) {       //如果是4瓶,可以先除以3,找老板换一瓶喝了后还给他
                        res[k] = in / 3;
                        int x = in / 3 + in % 3 + 1;
                        res[k] = res[k] + x / 3;
                    }

                    if (in > 4) {    //如果有4瓶以上,循环除以3(3个空瓶换一瓶),更新in的值
                        for (int j = 0; j < 10; j++) {   //in没到0,1,2,则继续循环
                            res[k] = res[k] + in / 3;
                            in = in / 3 + in % 3;    
                            if (in == 2) {       //如果in=2,找老板借一瓶,喝了后还他,蹭一瓶res[k]++。 
                                res[k]++;
                                in = 0;
                                break;
                            }
                            if (in == 0 || in == 1) break;  //如果in更新后的值是0,1时,已处理完,break.
                                              
                        }
                    }
                    k++;    // while循环中判断k是否小于10,因为最多接收10组输入。
                }        
        for (int i = 0; i < k; i++) {
               if(res[i]==0)
                   res[i]=65535;        //用65535标识除有效输入外,res[i]的数字
               if(res[i]==-1) res[i]=0;
            }
        for (int i = 0; i < k; i++) {
             if(res[i]!=65535)
                 System.out.println(res[i]);   //输出不为65535的res[i],如果输入为1, res[i]为0

        }
      }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国林哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值