PTA贪心总结:

贪心无疑说的就是一个局部最优解的问题,往往说明的当前状态下的局部最优(或较优)的策略。
如果我们采取的是非最优结果,取得的后果往往不一定是最优结果。因此要保证取得最优结果,就必须保证每一步取得的都是最优的。
但是贪心法无法这样做,它取到的往往只是局部最优的。在某些情况下贪心法可以保证最后的结果就是最优,但是要证明其是最优的,就得用数学归纳法去证明。
它给我们提供的一个思路是:在我们想到一个可行的策略之后,并且我们无法举出反例,该方法就是可以使用的。具体题型如下:

例题一:

1070 结绳 (25分)

给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。

rope.jpg

给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤10​4​​);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过10​4​​。

输出格式:

在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。

输入样例:

8
10 15 12 3 4 13 1 15

输出样例:

14
分析:大意是指我们如果将N段绳子(所有绳子都要用到)拿去按照题意所示拼接,最终能够得到的最大长度是多少。
这个时候就可以用贪心法:因为先拿去连接成为新绳子所付出的代价比较大(每次拼接都会少一半),
因此将长度最短的那部分提前拿去拼接,长度比较长的那部分之后再拼接就可以得到一个最大值。 

具体代码点此处。

例题二:

1020 月饼 (25分)

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。

输入样例:

3 20
18 15 10
75 72 45

输出样例:

94.50
分析:大意就是指在给定的需求量下,选择收益最高的月饼的组合。
我们同样可以利用贪心法:
将所有月饼的单价做一个排序,每次都选择卖出当前最贵的月饼,直到满足需求。

具体代码在此处 

 例题三:1023 组个最小数 (20分)

给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出 10 个非负整数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50,且至少拥有 1 个非 0 的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:

2 2 0 0 0 3 0 0 1 0

输出样例:

10015558
分析:根据题意所示,将所有的数组成最小的一个数。
此时我们也可以使用贪心法:
统计每个数出现次数,把出现了的更小的数放在前面,数比较大的放在后面。(建议尝试自己做一遍)

具体代码示例 

 

你可能感兴趣的:(算法总结)