7.19 贪心进阶 讲义
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。
证明贪心策略的基本思路
直观法
现在有很多价值不同的物品,你可以选择其中的 \(10\) 个,使得总价值最大。
这种就非常简单了,显然选价值越大的,最后总价值最大。
假设法
\(1\) 元、\(2\) 元、\(5\) 元、\(10\) 元、\(20\) 元、\(50\) 元、\(100\) 元的纸币分别有\(c_0\), \(c_1\), \(c_2\), \(c_3\), \(c_4\), \(c_5\), \(c_6\) 张。现在要用这些钱来支付 \(K\) 元,至少要用多少张纸币?
策略:优先选比当前需支付数值小的纸币里最大面值的支付
证明:假设在能使用 \(100\) 元纸币时不使用面值为 \(100\) 的纸币,那么至少需要 \(2\) 张 \(50\) 元的纸币来代替,一定比原来的使用张数更多。
交换法
给定两个数组 \(a,b\),请你给这两个数组排序,使得 \(\sum_{i=1}^{n}a_i\times b_i\) 最大
策略:都从小到大排序时最大
证明:假设现在已经从小到大排序了
\(a_1,a_2,...,a_n\)
\(b_1,b_2,...,b_n\)
我们交换任意两个,会变成:
\(a_1,a_2,...,a_n\)
\(b_2,b_1,...,b_n\)
一开始的结果是
\(a_1 b_1+a_2 b_2+...+a_n b_n\)
后来的结果成为
\(a_1 b_2+a_2 b_1+...+a_n b_n\)
两个式子之差 \(a_1 b_1+a_2 b_2-a_1 b_2-a_2 b_1=a_1(b_1-b_2)+a_2(b_2-b_1)\)
\(=(a_1-a_2)(b_1-b_2)>0\)
所以第一个式子更大,证毕。
练习
1
定义:在数列 \(a\) 中,满足 \(i<j\) 且 \(a_i>a_j\) 的称为逆序对。现在给定一个数列 \(a\),请你对它排序,使得逆序对数量最少。
2
P1056 [NOIP 2008 普及组] 排座椅
3
P1094 [NOIP 2007 普及组] 纪念品分组
4
P1223 排队接水
5
P1106 删数问题

浙公网安备 33010602011771号