zoukankan      html  css  js  c++  java
  • 关于5只猴子分香蕉

          有5只猴子在海边发现一堆香蕉,决定第二天来平分,第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了。第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份,问这堆香蕉至少有少只?

    方式一

    class Untitled {
        public static void main(String[] args) {
            int number;
            int count = 0;
            int i;
            for(i=6 ;;i=i+5){
                number = i;
                count = 0;
                while((number - 1) % 5 == 0){
                    count++;
                    number = (number -1) / 5 * 4;
                    if(count == 5){
                        break;
                    }
                }
                if(count == 5){
                    break;
                }
            }
            System.out.println(i);
        }
    }

    方式二 

    class Untitled {
        public static void main(String[] args) {
            System.out.println("沙滩上最少有" + count() + "个香蕉");
        }
    
        public static int count(){
            // n代表人数,k代表每次分配1份
            int n = 5, k = 1,min = 0;
            boolean flag = false;
    // j代表最后一个猴子分配之后的香蕉数量
    int j = 1; for(;;j++){ min = n*j+k; for(int i = 1;i < n;i++){ if(min % (n-1) == 0){ min = min * n / (n-1) +k; }else{ break; } if(i == n-1){ flag = true; break; } } if(flag == true){ break; } } System.out.println(j); return min; } }

    反推验证

    class Untitled {
    
        public static void main(String[] args) {
            System.out.println("---------" + (reverse(3121,5) == 1 ? "success":"fail") + "----------");
        }
    
        public static int reverse(int n,int m){
            //每次拿走后剩余num
            int num = n - 1 - (n - 1) / 5;
            m--;
            if(m > 0){
                //每次拿走的香蕉都能被5整除
                if((n - 1) % 5 == 0){
                    return reverse(num,m);
                } else {
                    return 0;
                }
            } else {
                return 1;
            }
        }
    }

    至少需要3121个香蕉,思路:采用倒推法.
    设第二天每一只猴子分a个香蕉
    第五只猴子未拿之前有:5a*(5/4)+1
    第四只猴子未拿之前有:5a*(5/4)²+5/4+1
    第三只猴子未拿之前有:5a*(5/4)³+(5/4)²+5/4+1
    第二只猴子未拿之前有:5a*(5/4)^4+(5/4)³+(5/4)²+5/4+1
    第一只猴子未拿之前有:5a*(5/4)^5+(5/4)^4+(5/4)³+(5/4)²+5/4+1 ··········①
    ①式后面5项为等比数列,求和有:5a*(5/4)^5+4*(5/4)^5-4=(5a+4)*(5/4)^5-4=min
    接下来求最小值min,令5a+4=4^5,解得a=204,带入即得min=3121.

  • 相关阅读:
    应对高并发场景的redis加锁技巧
    Spring中@Transactional事务回滚(含实例具体解说,附源代码)
    计算机网络10--计算机网络体系结构简单介绍
    IIS身份验证的配置
    AMR音频文件格式分析
    IOS版本号被拒的经历
    两分钟读懂《成大事者不纠结》——读书笔记
    同一个TextView设置不同的颜色和大小
    似非而是的程序猿悖论---为什么救火比防火更加吃香?
    OS
  • 原文地址:https://www.cnblogs.com/rinack/p/11069113.html
Copyright © 2011-2022 走看看