赞
踩
一. 题目描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是 5 瓶,方法如下:先用 9 个空瓶子换3瓶汽水,喝掉 3 瓶满的,喝完以后 4 个空瓶子,用 3 个再换一瓶,喝掉这瓶满的,这时候剩 2 个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用 3 个空瓶子换一瓶满的还给老板。如果小张手上有 n 个空汽水瓶,最多可以换多少瓶汽水喝?
数据范围:输入的正整数满足 1≤n≤100
注意:本题存在多组输入。
允许如题面所述向老板借汽水。
输入的 0 仅表示输入结束,并不用输出结果
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
输入:
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
-
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。