首页 > 试题广场 >

汽水瓶

[编程题]汽水瓶
  • 热度指数:492130 时间限制: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 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板    
#include<stdio.h>
int main (){
    int m;
    while(~scanf("%d",&m)&&m!=0) printf("%d\n",m/2);
    return 0;
}

通过数学分析,最后获得的饮料数是总空瓶数整除2 。
编辑于 2016-03-04 16:22:57 回复(158)

python解法,思路,每两个汽水瓶换一个,所以除以2就行了。

while True:
    try:
       a=int(input())
       if a!=0:
           print(a//2)

    except:
        break
发表于 2017-10-04 20:08:50 回复(45)
//动态规划:
状态:i对应最多可换的,别忘了初始化i = 2可以换一个;
  转移方程:
i%3== 0时:   dp[i] = i/3 + dp[i/3 + i%3];
i%3!= 0时: dp[i] = i/3 + dp[i/3];


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

        while (!sc.hasNext("0")) {
            //输入
            int n = sc.nextInt();
            if(n==1){
                System.out.println(0);
                continue;
        }
                        if(n == 2||n==3){
                System.out.println(1);
                continue;
        }
            //function函数
            int dp[]=new int[n + 1];
            dp[0] = 0;
            dp[1] = 0;
            dp[2] = 1;
            dp[3] = 1;
            dp[4] = 2;
            for (int i = 5; i < n + 1; i++) {
                if(i%3!= 0)
                    dp[i] = i/3 + dp[i/3 + i%3];
                else
                    dp[i] = i/3 + dp[i/3];
            }
            //输出
            if(n == 3){
                System.out.println(1);
                continue;
            }
            System.out.println(dp[n]);
        }
        sc.close();
        out.close();
    }
}

发表于 2021-04-06 18:27:19 回复(0)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    //定义静态成员变量记录每个输入用例的结果
    static int sum = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String s;
        //监听用户输入空瓶子数量
        while((s = bf.readLine()) != null){
            sum = 0;
            int parseInt = Integer.parseInt(s);
            //调用换瓶子的函数
            huanPingZi(parseInt);
            //输出结果
            System.out.println(sum == 0 ? "" : sum);
        }
    }

    //换瓶子
    private static void huanPingZi(int n){
        //除以3取模,看手里的空瓶子可以换多少瓶汽水
        int i = n / 3;
        //除以3取余数,看还有几个空瓶子
        int i1 = n % 3;
        //累加,记录换的汽水的总数
        sum += i;
        if(i+i1 >=3){
            //可以兑换的汽水数量大于3,喝完它们又是空瓶子,又可以继续重复该逻辑进行兑换
            //递归调用
            huanPingZi(i+i1);
        }else if(i + i1 == 2){
            //如果能够兑换的汽水和剩下的没有兑换的空瓶子加起来正好是2,那么向老板借一瓶,喝完再兑换一瓶还老板,所以这里兑换的汽水总数加1,递归结束
            sum += 1;
            return;
        }else{
            //不足2瓶,递归结束
            return;
        }
    }
}

发表于 2021-01-26 16:56:03 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null){
            int n = Integer.parseInt(line);
            if(n == 0) break;
            System.out.println(solve(n));
        }
    }
    
    private static int solve(int n){
        int soda = 0;      // 能兑换的汽水数
        while(n > 2){
            soda += n / 3;
            n = n % 3 + n / 3;
        }
        // 如果余下的瓶盖为2,还可以赊一瓶,因此汽水数+1
        if(n == 2) soda ++;
        return soda;
    }
}

发表于 2020-10-16 09:51:39 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
            Integer drinkNum = 0;
            Integer emptyNum = scan.nextInt();
            if(emptyNum == 0){
                continue;
            }else{
                while(emptyNum > 1){
                    if(emptyNum == 2){
                        emptyNum += 1;
                    }
                    drinkNum += emptyNum / 3;
                    emptyNum = (emptyNum / 3) + (emptyNum % 3);
                }
            }
            System.out.println(drinkNum);
        }
    }
}


发表于 2020-09-03 16:15:58 回复(0)
这个案例有问题吧,最后他要求的输出结果还要加个0,害的我搞了半天,哎

发表于 2020-08-17 09:26:06 回复(1)
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int i=0;
        while (input.hasNext()) {
            int nextInt = input.nextInt();
            if (i > 10 || nextInt == 0) {
                break;
            }
            i++;
            System.out.println(nextInt / 2);
        }
    }
}



发表于 2020-07-14 17:09:11 回复(1)
m = 0
while m > 10:
    try:
        count = 0
        n = int(input())
        while n > 2:
            count = n // 3
            n -= n // 3 * 2
        if n == 2:
            count += 1
        print(count)
    except:
        break

发表于 2020-03-22 21:01:17 回复(2)
#include<iostream>
#include<vector>
using namespace std;
int main(){
    //动态规划
    //初始条件:memo[0]=0,memo[1]=0,memo[2]=1
    //迭代公式:
    //a = input/3
    //b = input%3
    //memo[input] = a+memo[a+b]
    int input;
    int n = 10;
    vector<int>memo;//备忘录
    vector<int>res;//存储输入的数据对应的输出
    memo.push_back(0);
    memo.push_back(0);
    memo.push_back(1);
    while ((cin >> input) && n--){
        if (input == 0) break;
        if (input >= memo.size()) {
            for (int i = memo.size(); i <= input; i++){
                int a = i / 3;
                int b = i % 3;
                memo.push_back(a + memo[a + b]);
            }
        }
        res.push_back(memo[input]);
    }
    for (int i = 0; i < res.size(); i++){
        cout << res[i] << endl;
    }
    system("pause");
    return 0;
}提交观点

发表于 2019-07-09 15:44:42 回复(0)
var result = 0;
function count(empty){
    if(!!empty){
        if(empty >= 3){
            result += Math.floor(empty/3);
            empty = empty%3 + Math.floor(empty/3);
            return count(empty)
        }else if(empty === 2){
            result += 1;
        }
    }
    return result
}  

发表于 2019-04-21 20:08:59 回复(0)
#include<iostream>
#include<string>
#include<cstddef>   
#include<vector>
using namespace std;
vector<int>v;
 void track(int n)
{
v.push_back(1);
if(n<3)   
{  
 if(n==2)
    {v.push_back(1);}
return ;
}
else if(n>=3)
{
track(n-2);
}
}
int main()
{
  int n;
  while(cin>>n)
  {
  v.clear();
  int number=0;
  if(n>=3)
  {
  track(n);
  number=v.size()-1;
  }
  cout<<number<<endl;
  }
  return 0;
  }
  
发表于 2019-04-19 15:06:36 回复(0)
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        if(n!=0) cout<<n/2<<endl;
        else break;
    }
}


编辑于 2018-08-28 23:08:58 回复(0)
#include <iostream>
using namespace std;
intmain(){
    intn;
    while(cin>>n){
        cout<<n/2<<endl;
    }
}

编辑于 2017-08-08 16:32:07 回复(0)
/*
递归问题
3个瓶子换1瓶水+1个空瓶子,两个瓶子换1瓶水+0个空瓶子,1个瓶子换0瓶水。
f(1) = 0
f(2) = 1
f(3) = 1
f(4) = f(2)+1    //4个瓶子,其中3个可以换1瓶水+1个空瓶,所以是f(2)+1
f(5) = f(3)+1    //3个瓶子换1瓶水+1个空瓶,所以是f(3)+1
...
f(n) = f(n-2)+1 */
#include <iostream>
 
using namespace std;
 
int f(int n)
{
    if(n==1) return 0;
    if(n==2) return 1;
    return f(n-2)+1;
}
 
int main()
{
    int n;
    while(cin >> n){
        if(n==0)
            break;
        cout<<f(n)<<endl;
    }
    return 0;
}

发表于 2016-03-01 22:03:43 回复(25)
public static int MaxChange(int num)
    {
        int count=0;
        while(num/3!=0)
        {           
            count+=num/3;
            num=num/3+num%3;
            if(num==2)count++;
        }
        return count;
    }

发表于 2017-07-06 21:05:22 回复(0)
import java.util.Scanner;
public class Main{
 public static void main(String[] args) {
  Scanner sc=new Scanner(System.in);
  while (sc.hasNext()) {
   int a=sc.nextInt();
   System.out.println(a/2);
   
  }
 }
}

发表于 2017-04-04 14:17:04 回复(0)
采用递归来看,逻辑比较清楚,n次喝到的汽水总数等于n-1次喝到汽水总数加上n-1次最终剩余的瓶子数目
import java.util.*;
public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input=new Scanner(System.in);
        while(input.hasNext()){
            int n=input.nextInt();
            int m=calSodar(n);
            System.out.println(m);
            }
        input.close();
    }
    public static int calSodar(int n){
        int a,b;        //a表示n-1次喝到的汽水总数,b表示最终剩余的瓶子数目
        if(n==2){
            a=1;b=0;
            return a+b;
        }
        else{
            if(n%2==0){
                b=1;
                a=calSodar(n-1);
                return a+b;
            }
            else{
                b=0;
                a=calSodar(n-1);
                return a+b;
            }
        }
    }

}

编辑于 2016-07-17 16:23:28 回复(0)
def bottlenumber(n):
    num = 0;
    m = 0;
    q = 0;
    if n < 2:
        return 0;
    
    else:
        while n > 1:
            m = n/3;
            num += m;
            q = n%3;
            n = m + q;
            if n == 2:
              n = 0;
              num += 1;
        return(num);
    

num2 = 0;
num2 = int(input());
bottlenumber(num2);



觉得思路没问题,但为啥答案错误:您提交的程序没有通过所有的测试用例

测试用例:
59

对应输出应该为:

29
发表于 2016-01-11 22:06:24 回复(3)
while(line = readline()){
    var num = Number(line);
    if(num!==0){
        console.log(Math.floor(num/2));
    }

}
编辑于 2020-11-12 10:39:20 回复(0)

问题信息

难度:
1691条回答 180340浏览

热门推荐

通过挑战的用户

查看代码