算法1

(暴力枚举) $O(n^3)$

枚举每一种取法,计算取出的糖果数,记录最大值即可。

时间复杂度

枚举 $n^3$ 种取法,计算每种取法需要 $O(1)$ 的时间,总时间复杂度为 $O(n^3)$。

C++ 代码

算法2

(贪心) $O(n\log n)$

首先将三堆糖果按照数量从小到大排序,然后我们每次从最少的一堆拿出一个糖果,直到剩下的两堆糖果的数量相等或者只有一颗糖果。

如果最少的一堆糖果数量小于等于另外两堆糖果数量之差,则可以继续从另外两堆中拿糖果,直到剩下的两堆糖果数量相等。

否则,只能从另外两堆糖果中拿走剩下的所有糖果,使得三堆糖果数量相等。

时间复杂度

排序的时间复杂度为 $O(n\log n)$,拿糖果的过程需要遍历三堆糖果,时间复杂度为 $O(n)$,所以总时间复杂度为 $O(n\log n)$。

C++ 代码

算法3

(数学) $O(1)$

假设三堆糖果数量分别为 $a,b,c$,可以发现,每次拿走一颗糖果,会使得两个数减去一,另一个数不变,即 $(a-1,b-1,c)$ 或 $(a-1,b,c-1)$ 或 $(a,b-1,c-1)$。

因此,我们可以通过不断执行这样的操作,使得三个数趋近于相等。最后三个数相等的时候,就是取糖果的最优方案。

具体实现时,我们可以先将三个数排序,然后每次将最小的一个数加上另外两个数的差值,直到三个数相等。

时间复杂度

排序的时间复杂度为 $O(n\log n)$,每次操作需要 $O(1)$ 的时间,所以总时间复杂度为 $O(n\log n)$。

C++ 代

题目描述有三堆糖果 你想要拿去更多的糖果 但是你必须遵循拿糖果的要求 比如说三堆糖果是 ���abc从 �a 中拿走 11 块糖果 同时从 �b 中拿走 22 块糖果从 �b 中拿走 11 块糖果 同时从 �c 中拿走 22 块糖果数据格式输入格式多组数据 第一行输入一个整数 �t 表示 �t 组数据接下来每组数据中输入 33 个整数 ���abc输出格式输出 �t 行 每行一个整数表示最大值

原文地址: https://www.cveoy.top/t/topic/hcLQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录