zoukankan      html  css  js  c++  java
  • [编程题] 汽水瓶

    [编程题] 汽水瓶

    1/3 [编程题] 汽水瓶

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32M,其他语言64M
    

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

    输入描述:

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

    输出描述:

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

    输入例子1:

    3
    10
    81
    0

    输出例子1:

    1
    5
    40

    个人方法

    思路:

    空瓶数 < 2 : 可换0个

    空瓶数 == 2 : 可换1个

    每次换后,剩余空瓶数 = 空瓶数/3 + 空瓶数%3

    (python)

    # !/usr/bin/env python2
    # -*- coding:utf-8 -*-
    '''
    Created on 2020.03.01 03:05
    @author: oucbl
    '''
    # 法1: 递归求解
    def get_cola_nums(bottle_nums):
        if bottle_nums < 3:
            if bottle_nums == 2:
                return 1
            return 0
        return bottle_nums / 3 + get_cola_nums(bottle_nums / 3 + bottle_nums % 3)
    
    # 法2: 循环求解
    def get_cola_nums2(bottle_nums):
        count = 0
        while bottle_nums > 1:
            count += bottle_nums / 3
            bottle_nums = bottle_nums / 3 + bottle_nums % 3
            if bottle_nums == 2:
                count += 1
                break
        return count
    
    if __name__ == '__main__':
        dnums = []
        while True:
            i = input()
            if 0 == i : break
            else: dnums.append(int(i))
    
        for i in dnums:
            print get_cola_nums(i), get_cola_nums2(i)
    

    (c++)

    /*************************************************
    Author: oucbl
    Date: 2020.02.29
    **************************************************/
    #include <iostream>
    using namespace std;
    
    // 函数声明
    int get_cola_nums(int );
    int get_cola_nums2(int );
    
    
    int main()
    {
        int i, *dnums = new int[10];
        
        for(int j=0; j < 10; j++)
        {
            cin >> i;
            if (i != 0)
            {
                dnums[j] = i;
            }
            else
            {
                break;
            }
        }
        
        for(int j=0; j < 10; j++)
        {
            if(dnums[j] ==0)
            {
                break;
            }
            cout << get_cola_nums(dnums[j]) << " " << get_cola_nums2(dnums[j]) << endl;
        }
    
        delete [] dnums;
        return 0;
    }
    
    // 法1: 递归求解
    int get_cola_nums(int bottle_nums)
    {
        if(bottle_nums < 3)
        {
            if (bottle_nums == 2)
            {
                return 1;
            }
            return 0;
        }
        return bottle_nums / 3 + get_cola_nums(bottle_nums / 3 + bottle_nums % 3);
    }
    // 法2: 循环求解
    int get_cola_nums2(int bottle_nums)
    {
        int count = 0;
        while ( bottle_nums > 1)
        {
            count += bottle_nums / 3;
            bottle_nums = bottle_nums / 3 + bottle_nums % 3;
            if (bottle_nums == 2)
            {
                count++;
                break;
            }
        }
        return count;
    }
    

    优秀解析

    1. 递归问题(c++)

    /*
    递归问题
    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;
    }
    

    2. 数学分析(c)

    #include<stdio.h>
    //通过数学分析,最后获得的饮料数是总空瓶数整除2 。
    int main (){
    
        int m;
    
        while(~scanf("%d",&m)&&m!=0) printf("%d
    ",m/2);
    
        return 0;
    
    }
    

    3. 数学分析(python)

    # 每两个汽水瓶换一个,所以除以2就行了。
    while True:
        try:
           a=int(input())
           if a!=0:
               print(a//2)
     
        except:
            break
    

    4. 常规解法(java)

    public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            while (scan.hasNext()) {
                blank = scan.nextInt();
                int drink = 0;
                int remain;
                if (blank > 0 && blank <= 100) {
                    if (blank == 1) {
                        drink = 0;
                    } else if (blank == 2) {
                        drink = 1;
                    }
                    while (blank > 2) {  //10,4,5
                        drink += blank / 3;   //3 drink,4 drink
                        remain = blank % 3;  //1 remain,1 remain
                        blank = blank / 3 + remain;   //4 blank,2 blank
                        if (blank == 2) {
                            drink++;
                        }
                    }
                }
                System.out.println(drink + "");
            }
    }
    
  • 相关阅读:
    VM启用ISO共享
    部署服务--NLB
    SCVMM问题汇总
    判断文件是否存在(exist)
    函数(Function)作用域 / 远程函数执行
    基于433MHz无线串口,多发一收解决方案
    ZigBee自组网地址分配与路由协议概述
    Zigbee协议栈--Z-Stack的使用
    RT-Thread RTOS
    信息量、互斥信息量和事件标志
  • 原文地址:https://www.cnblogs.com/oucbl/p/12387872.html
Copyright © 2011-2022 走看看