算法题解 - 牛客编程巅峰赛S1第4场 - 黄金&钻石组

本文介绍了牛客编程巅峰赛S1的三道题目:牛牛分蛋糕、牛牛凑数字和牛妹的野菜。对于牛牛分蛋糕,提供了暴力搜盘子和二分搜蛋糕两种解法;牛牛凑数字通过贪心策略求解;牛妹的野菜使用回溯法寻找挖番薯的最佳路径。文章详细分析了解题思路并附有代码实现。
摘要由CSDN通过智能技术生成

A. 牛牛分蛋糕

题目描述

牛牛今天家里要来客人,所以牛牛今天特意做了他最拿手的两种蛋糕,但是他是一个有洁癖的人,所以他在分蛋糕时,有如下几个原则:

  1. 他不希望一个盘子里出现两种蛋糕

  2. 他希望每个盘子中都有蛋糕

  3. 他想让装有最少蛋糕数量的盘子中装有的蛋糕数量尽可能多

备注:

n, a, b(1 ≤ a, b ≤ 10^5, 2 ≤ n ≤ a + b)
第一个参数代表盘子的数量
第二个参数代表第一种蛋糕的数量
第三个参数代表第二种蛋糕的数量。
程序应返回:在所有分法中,蛋糕数量最少的盘子中分到最多的蛋糕数量。

示例1

输入

5, 2, 3

输出

1

说明

只有一种方法把蛋糕分配到盘子里,即所有的盘子上都有一个蛋糕。

示例2

输入

4, 7, 10

输出

3

说明

第一个盘子中装有第一种蛋糕三个,第二个盘子中装有第一种蛋糕四个,第三个、第四个盘子中各装有第二种蛋糕五个。

解法一:暴力搜盘子

思路分析

要想装最少蛋糕数量的盘子中装的蛋糕最多,必定是均匀分配蛋糕。因此可以搜索所有的盘子分配方案,看哪种情况下均匀分配到的蛋糕最多。

时间复杂度: O ( n ) O(n) O(n)。总共有 n − 1 n - 1 n1 种盘子分配方案。

空间复杂度: O ( 1 ) O(1) O(1)

代码实现

public int solve (int n, int a, int b) {
   
  int res = 0;
  for(int i = 1; i < n; i++) {
   
    int min = Math.min(a / i, b / (n - i));
    res = Math.max(res, min);
  }
  return res;
}

解法二:二分搜蛋糕

思路分析

每个盘子都分配 c c c 块蛋糕,若 a / c + b / c ≥ n a / c + b / c \ge n a/c+b/cn 说明这样分配能使 n n n 个盘子中都有蛋糕。二分搜索寻找最大的 c c c 即可。

时间复杂度: O ( l o g ( m i n ( a , b ) ) ) O(log(min(a,b))) O(log(min(a,b)))

空间复杂度: O ( 1 ) O(1)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值