首页 > 试题广场 >

汽水瓶

[编程题]汽水瓶
  • 热度指数:494504 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足

注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。

输入描述:

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



输出描述:

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

示例1

输入

3
10
81
0

输出

1
5
40

说明

样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换
样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板    
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        if (line == '0') continue;
        console.log(Number(line) >> 1);
    }
}()

发表于 2023-08-21 15:19:06 回复(0)
function getBottle(num) {
    if (num === 0 || num === 1) {
      return 0   
     } else if (n > 1) {
        return Math.floor(n / 2)
     }
 }
发表于 2022-08-15 22:18:31 回复(0)
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
const lines = [];
rl.on("line", function (line) {
  if (line === "0") {
    return;
  }
  const f = parseInt(line);
  let count = 0;
  let drink = Math.floor(f / 3); // 换
  let rest = f % 3; // 余下几瓶
  count = count + drink;
  while (drink > 0) {
    const temp1 = Math.floor((drink + rest) / 3);
    const rest1 = (drink + rest) % 3;
    count = count + temp1;
    drink = temp1;
    rest = rest1;
    // 加入借的场景
    if (temp1 === 0 && rest1 === 2) {
      count++;
    }
  }
  console.log(count);
});

SB解法

发表于 2022-06-02 22:58:17 回复(1)
var sum=0;//喝的次数
const drinkFun=function(num) {
    let n = parseInt(num); //空瓶总数
    if(n===0) return;
    const one = 1; //常量1
    const kPing = 3; //常量空瓶
    if (n % 3 >= 0 && n >= 3) {
      sum = parseInt(sum + one); //喝了1次
      console.log("3空瓶换1瓶喝,喝了第" + sum + "次");
      console.log("喝完剩" + one + "个空瓶");
      console.log(
        "原来还剩" + parseInt(n - kPing) + "个空瓶",
        "加上面" + one + "个喝完的空瓶"
      );
      console.log("还有" + parseInt(n - kPing + one) + "个空瓶");
      drinkFun(parseInt(n - kPing + one));
    } else {
      //空瓶数小于3
      console.log(
        "正常来说,到这里你不可以喝了,因为你还剩" + n + "个空瓶,"
      );
      console.log(
        "但是,你任性的可以再向老板借" +
          one +
          "个空瓶,但借完必须要还" +
          one +
          "个空瓶,"
      );
      console.log("那就速度向老板借" + one + "个空瓶吧!");
      console.log("加上手里还剩的" + n + "个空瓶,");
      n = parseInt(n + one);
      console.log("看下类型," +typeof n );
      console.log("你现在有" + n + "个空瓶,");
      if (n % 3 >= 0 && n >= 3) {
        //借了1个,还能大于等于3个空瓶,那就继续递归
        drinkFun(n);
      } else {
        //借了1个,还是小于3个,那就结束了,
        console.log(
          "额哦~老板借了你1个空瓶,你都喝不起了,没办法了,最后记得还老板1个空瓶哦!"
        );
        n = parseInt(n - one);
        console.log(
          "结束:你最后剩" + n + "个空瓶,喝了" + sum + "次汽水。"
        );
        sum=0;//结束后次数清零
      }
    }
  }

const testFun=function (item){
    if(!item) return '请输入数据'; //如果没有输入返回空
    console.log('读取的数据,',item);
    drinkFun(item); //笨笨的递归
}

const rL=require('readline');//引入读行包
const rLObj=rL.createInterface({input:process.stdin,output:process.stdout});//用线程创建输入输出的接口
rLObj.on('line',testFun);//绑定读行函数,执行实现的方法


//----------以上是晕头晕脑整理思路的代码哈哈,下面整理后的-------

//----------实现的方法---start-------
var sum=0;//喝的次数
var inputNum=10;//可用的输入次数
const drinkFun=function(n) {
    const one = 1; //常量1
    const kPing = 3; //常量空瓶
    if (n % 3 >= 0 && n >= 3) {
      sum = parseInt(sum + one); //喝了1次
      drinkFun(parseInt(n - kPing + one));
    } else {
      n = parseInt(n + one);
      if (n % 3 >= 0 && n >= 3) {
        drinkFun(n);
      } else {
        n = parseInt(n - one);
        console.log(sum);
        sum=0;//结束后次数清零
      }
    }
}

const testFun=function (item){
  if(parseInt(item)>=1 &&parseInt(item)<=100){//正整数 n( 1<=n<=100 )
      if(inputNum>0){
        drinkFun(parseInt(item)); //笨笨的递归
        inputNum--;
      }
    }
   
}
//----------实现的方法---end-------

//----------简易Js Node的输入 的题头写法---start-------
const rL=require('readline');//引入读行包
const rLObj=rL.createInterface({input:process.stdin,output:process.stdout});//用线程创建输入输出的接口
rLObj.on('line',testFun);//绑定读行函数,执行实现的方法
//----------简易Js Node的输入 的题头写法---end-------




编辑于 2022-05-17 21:37:02 回复(0)
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let list = [];
rl.on("line", function (line) {
  list.push(line);
});

rl.on("close", function (line) {
  for (let i = 0; i < list.length; i++) {
      let num = 0;
    let d = parseInt(list[i]);
    if (d === 0) {
      break;
    }
    if (d < 2) {
      console.log(0);
    } else {
      num = fn(d, num);
    }
    console.log(num);
  }
});

function fn(d, num) {
  let y = d % 3;
  let s = parseInt(d / 3);
  num = num + s;

  if (s + y > 2) {
    let newst = y + s;
    num = fn(newst, num);
    return num;
  } else if (s + y == 2) {
    num = num + 1;
    return num;
  } else {
    return num;
  }
}

发表于 2022-04-22 20:14:34 回复(0)
回答中遍寻不得JavaScript,补充一下。两种方法都有
JavaScript V8 
//方法1: 直接用数学方法分析,别问,我也是看题解才想明白的
while(line = parseInt(readline())){
    console.log(Math.floor(line / 2))
}

//方法2: 递归
var arr = [];
//这个判断会自动帮我们把最后用于结束的 0 给省略
while(line = parseInt(readline())){
    arr.push(line);
}
//工具函数
var recursion = (n) => {
    let res = 0;
    //拥有的空瓶大于3,就可以进行操作
    while(n >= 3){
        //先正常换,每次把换到的汽水记录到res
        res += Math.floor(n / 3);
        //每次换完之后,重新维护空瓶数n,进行下一轮换汽水
        n = Math.floor(n / 3) + n % 3;
    }
    //空汽水瓶为2时,才需要借一个,少了(n == 1)还不起,多了(n >= 3)没必要借
    if(n == 2) n++;
    return res;
}
//依次输出答案
for(let n of arr){
  console.log(recursion(n))
}


编辑于 2022-04-01 02:23:28 回复(0)
const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line', function (line) {
    var n = parseInt(line);
    var m = n/2;
    if(n>=1&&n<=100){
        console.log(Math.floor(m));
    }
});

发表于 2021-11-12 10:32:18 回复(0)

let n = parseInt(readline());
      let sum = 0;
      function fn1(n) {
        let a = Math.floor(n / 3);//每次能换的瓶数
        sum += a;//换的瓶数总和
        n = a + n % 3;//更新空瓶数
        if (n > 2) {//若空瓶数大于2 函数继续执行
          return fn1(n);
        } else if (n === 2) {//若空瓶数等于2 借老板一瓶,即又换了一瓶(sum+1),最后三空瓶还给老板,函数结束
          return sum += 1
        } else {//若空瓶小于2,则返回sum,函数结束
          return sum
        }
      }
      console.log(fn1(n));



发表于 2021-11-10 12:22:58 回复(0)
js v8 处理输入输出版
var line;
while(line = readline()){
    var lines = line.split('\n');
    var n = parseInt(lines[0]);
    function change(n){
        var exnum = 3;
        var soda = 0;
        var back = 0;
        if(n == 0){
            soda = 0;
        }
        while(n >= exnum){
            back  = Math.floor(n/exnum);
            n = n%exnum+back;
            soda+=back;
        }
        if(n == exnum-1){
            var borrow = 1;
            soda = soda+borrow;
        }
        return soda;
    }
    print(change(n));
}


发表于 2021-09-01 10:20:30 回复(0)
const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})
// 相对于2个空瓶子即可换一瓶汽水喝
rl.on('line', function (input) {
    if (+input !== 0) {
        console.log(Math.floor(+input / 2))
        input = null
    }
})

发表于 2021-08-27 23:08:31 回复(0)
js版本,迭代法,可以通过。
let indata =[];

while(line = readline())
{
    if(line == 0) {break;}
    indata.push(line);
}

var foo=function(){
    let out=[];
    for(let i of indata){
        let s=i,t=0;
        while( s >= 3){ 
            t = t + Math.floor( s/3);
            s = s%3 + Math.floor( s/3);
        }
        if(s == 2) {t+=1};
        print(t);
    }
}
foo()

发表于 2021-07-16 21:06:15 回复(0)
while(line = readline()){
    console.log(Math.ceil((Number(line)-1)/2))
}
发表于 2021-07-11 11:10:45 回复(0)
while(line = readline()){
    console.log(Math.ceil((Number(line)-1)/2))
}


发表于 2021-06-15 17:17:38 回复(0)
var readline = require('readline');
var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line', function (input) {
    if(input !== '0'){
        let left = Number(input)
        let result = 0
        while(left >= 3){
            const newBottles = Math.floor(left/3)
            result += newBottles
            left = left % 3 + newBottles
            
        }
        if(left === 2) result++
        console.log(result)
    }
});

发表于 2021-03-22 07:56:16 回复(0)
核心思路其实是这样的:
可以根据题目描述发现:我们每有3个空瓶子就能换1个新瓶子,也就是说这一顿操作下来我们实际上是付出了2个空瓶子
因而,能够得到几个新瓶子汽水,就可以等价转化为能够进行几次收获2空瓶的操作,所以结果就是原始空瓶子数对2整除,也就是直除后通过舍去法取整(余数舍弃),因为余数不能当作一次新的操作
推导过程:
以3个空瓶子换1个新瓶子为例,我们的获取方式是 3 -3+1 =1,无法继续兑换,结束。上面我说到的付出2个空瓶子,就是这里得到的(-3+1)的值,总共进行了一次(-3+1),所以结果为1;
5个空瓶子:第一次兑换 5 -3+1 =3;第二次兑换 3 -3+1 = 5 -3+1 -3+1 =1 ,无法继续兑换,结束,可以发现出现了2次(-3+1),输出结果为2;
10个空瓶子:第一次兑换10 -3+1 = 8;第二次兑换 8 -3+1 = 10 -3+1 -3+1 = 6;第三次兑换 6 -3+1 = 10 -3+1 -3+1 -3+1 = 4;第四次兑换 4 -3+1 = 10 -3+1 -3+1 -3+1 -3+1 = 2,无法继续兑换,结束,共出现了4次(-3+1),输出结果为4;
因此我们就对这一次少2个空瓶的操作进行计数,那么方法就是总数÷2。
因为我用的是JavaScript,所以不能像C那样直接输入int做除法。js直接做除法得到的是浮点数,所以需要额外增加一个取整函数(我用的是floor)
let line;
while(line = readline()) {
    print (Math.floor(line / 2));
}
顺便问一下究竟js该怎么处理牛客的acm模式的stdio,readline方法没太折腾明白,人已经傻了
编辑于 2021-02-04 13:21:13 回复(1)
var readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})
var count = 0
rl.on('line', (line) => {
    
    line = parseInt(line)
    if(line === 0) return 
    while(line > 1) {
        var temp = parseInt(line/3)
        count += temp
        line = temp + line % 3
        if(line === 2){
            line += 1
        }
    }
    console.log(count)
})
问什么这样写,输出结果不对,在浏览器下测试没有问题啊
发表于 2020-12-06 16:01:25 回复(0)
while(line = readline()){
    var num = Number(line);
    if(num!==0){
        console.log(Math.floor(num/2));
    }

}
编辑于 2020-11-12 10:39:20 回复(0)
const getRes = function(n,z){
    let s = Math.floor(n/3)//此次能换的瓶子
    z = z + s //res
    let y = n%3 + s//剩余的瓶子
    if(y > 3){
       return getRes(y,z)
    }else if(y >=2){
        return z+1
    }else{
        return z
    }
}
let n 
while(n=readline()){
    if(n===0){ break }//如果输入0 终止程序
    n=Number(n)
   console.log(getRes(n,0)) 
}

编辑于 2020-07-16 12:03:19 回复(0)
JavaScript
woc,做完一看回答,尼玛直接空瓶整除2就完了......

大佬惹不起,以下是我的蠢方法...
while(n=readline()){
    var b,c,count=0;
    while(b = Math.floor(n/3)){
        count +=b;
        c = n%3;
        n = b+c;
    }
    if(n == 2){
        count++;
    }
    print(count);
}


编辑于 2020-03-10 00:42:03 回复(0)

问题信息

难度:
25条回答 180424浏览

热门推荐

通过挑战的用户

查看代码