贪心,每次都选择当前看起来最优的选择(局部最优解),对于贪心问题,虽然说没有套路,但可以通过不断尝试来确定贪心做法。例如区间问题,一般来说就是排序,常见有按左端点排序、按右端点排序、双关键字排序等,之后再举一些特例,都能满足的话贪心策略应该就没什么问题了,可以尝试证明一下。而且很多贪心问题都可以转化为常见的一些贪心问题。
区间问题
1.区间选点
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。
输出选择的点的最小数量。
位于区间端点上的点也算作区间内。
输入格式
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需的点的最小数量。
思路:将每个区间按右端点从小到大排序,从前往后依次枚举每个区间(尝试做法是否可行,并进行当前的最优做法),若当前区间中已包含点,则直接跳过,否则选择当前区间的右端点。
做法合理性:按照这样的做法,选择完以后,每个区间一定包含了一个点,且单独包含一个区间的点一定是与其他区间没有交集的,所以该合法方案一定是最小。
2.最大不相交区间数量(选课问题)
给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。
输出可选取区间的最大数量。
输入格式
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示可选取区间的最大数量。
思路:与上题一样,将每个区间按右端点从小到大排序,从前往后依次枚举每个区间,若当前区间中已包含点,则直接跳过,否则选择当前区间的右端点。
3.区间分组
给定 N个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
输出最小组数。
输入格式
第一行包含整数 N,表示区间数。
接下来 N 行,每行包含两个整数ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示最小组数。
思路:将所有区间按左端点从小到大进行排序,从前往后处理每个区间,判断能否将其放到某个现有的组中(判断组内所有区间的右端点的最大值是否大于等于当前区间的左端点),如果不能,则开一个新的组,再将其放进去;否则,将其放入,并更新所有区间的右端点最大值(减少计算量)
4.区间覆盖
给定 N个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。
输出最少区间数,如果无法完全覆盖则输出 −1。
输入格式
第一行包含两个整数 s和 t,表示给定线段区间的两个端点。
第二行包含整数 N,表示给定区间数。
接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。
输出格式
输出一个整数,表示所需最少区间数。
如果无解,则输出 −1。
思路:将左端点按从小到大进行排序,从前往后依次枚举每个区间,在所有能覆盖起点的区间中选择右端点最大的区间(用右端点而不是区间长度表示,方便后续步骤),然后把起点更新成右端点的最大值。
总结:对于区间问题,一般是根据已经做过、证明的基本题,推出该题类似于哪种题型,或者是不断进行尝试排序做法,若符合,则再进行特例尝试、证明。
排序不等式
排队打水
有 n个人排队到 1 个水龙头处打水,第 i个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 n。
第二行包含 n 个整数,其中第 i 个整数表示第 i 个人装满水桶所花费的时间 ti。
输出格式
输出一个整数,表示最小的等待时间之和。
思路:先对样例进行分析
分别置为t1 t2 t3 t4 ...tn那么总时间=t1*(n-1)+t2*(n-2)+...+tn*(n-n)
可以发现第一个乘的数最大,第二个人往后乘的数递减,要使总时间最短,就让t大的放在后面。
所以把时间按照从小到大的顺序进行排序,可使总时间最小。
绝对值不等式
货仓选址
在一条数轴上有 N 家商店,它们的坐标分别为A1∼AN。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数 N。
第二行 N 个整数 A1∼AN。
输出格式
输出一个整数,表示距离之和的最小值。
思路:画图可得距离公式
f(x)=|x1-x|+|x2-x|+...+|xn-x|
其实直观感觉,就应该把货仓设置在中间位置,再去证明他的合理性就可以了。但是部分题比较复杂,凭直观无法判断,这时候画图推一推效果更好。
问题就转化为求fx最小值(用图直观反映一下距离和)
f(x)=(|x1-x|+|xn-x|)+(|x2-x|+|xn-1-x|)+...
>=xn-x1+xn-1-x2+...
即货仓地址选在中位数,或中间两个数的平均值。
不止绝对值不等式在证明中可以应用,其他不等式也可以进行贪心策略的证明。
总结来说这周博客看的还是太少,主要复习期末考试去了,感觉写不出东西来,不能只靠晚上和周末的一段时间看博客,这样积累的不够多,平时一些零碎时间也可以用起来。