0%

1553. 吃掉 N 个橘子的最少天数

1553.吃掉 N 个橘子的最少天数

题目描述:

厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子:

  • 吃掉一个橘子。
  • 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。
  • 如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。

每天你只能从以上 3 种方案中选择一种方案。

请你返回吃掉所有 n 个橘子的最少天数。

数据范围:

$1\le n \le 2\times 10^9$

题解:

操作一的次数有限,主要是需要靠操作二和操作三。

如果 $n$ 不能被 $2$ 和 $3$ 整除,就需要使用操作一,调整到能使用 $2$ 或 $3$ 。调整的次数为 $1$ 或 $2$ 。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const static long long mod = 1e9 + 7;
const long long INF_LL = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
unordered_map<int, int> mp;
int minDays(int n)
{
if (n <= 1)
return 1;
if (!mp.count(n))
mp[n] = 1 + min(n % 2 + minDays(n / 2), n % 3 + minDays(n / 3));
return mp[n];
}
};