牛客题解 | 小东分苹果

题目

题目链接

解题思路

这是一个递归解法的苹果分配问题。关键点:

  1. 递归函数定义

    • getInitial(n, k, x):表示还剩 k 头熊,当前苹果数为 x 时是否可行
    • n:总熊数
    • k:剩余熊数
    • x:当前苹果数
  2. 递归条件

    • 基础情况:k=0时返回true,表示所有熊都分完了
    • 剪枝条件:(x-1)%n != 0时返回false,表示不能均分
    • 递归:检查下一头熊分苹果的情况
  3. 主函数

    • 从1开始枚举可能的初始苹果数
    • 找到第一个满足条件的数即为答案

代码

class Apples {
public:
    bool getInitial(int n, int k, int x) {
        if(k == 0) return true;
        if((x-1) % n != 0) return false;
        return getInitial(n, k-1, (x-1)*(n-1)/n);
    }
    
    int getInitial(int n) {
        for(int i = 1; i <= INT_MAX; i++) {
            if(getInitial(n, n, i)) {
                return i;
            }
        }
        return 0;
    }
};
import java.util.*;
public class Apples {
    public boolean getInitial(int n, int k, int x) {
        if(k == 0) return true;
        if((x-1) % n != 0) return false;
        return getInitial(n, k-1, (x-1)*(n-1)/n);
    }
    
    public int getInitial(int n) {
        for(int i = 1; i <= Integer.MAX_VALUE; i++) {
            if(getInitial(n, n, i)) {
                return i;
            }
        }
        return 0;
    }
}
# -*- coding:utf-8 -*-

class Apples:
    def check(self, n, k, x):
        if k == 0:
            return True
        if (x-1) % n != 0:
            return False
        return self.check(n, k-1, (x-1)*(n-1)//n)
    
    def getInitial(self, n):
        i = 1
        while True:
            if self.check(n, n, i):
                return i
            i += 1

算法及复杂度

  • 算法:递归 + 枚举
  • 时间复杂度:O(kn),其中 k 为最小解的大小,每个数需要递归 n
  • 空间复杂度:O(n),递归栈的深度为n
posted @   wangxiaoxiao  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示