几类贪心基本例题

贪心都是按照一定规则处理问题的。至于这个规则的证明一般有两种办法:归纳法和反证法。。我会第二种的一部分,找反例。一般来说都没人去肝贪心问题的证明。太长了也太难了。。大概正确的话基本都是正确的。凭直觉??(不能贪那肯定是DP了)(贪了很久还是WA,那么十有八九是DP)

1.硬币问题
给定若干种面额的硬币,每种数量不同。求怎么用来支付n元使得硬币数最少。(1,5,10,50,100)
这个显然可以贪心,因为大硬币可以用小硬币表示(不互质)(类似进制分解,二进制2能表示64 16 32 128..)

for(int i = n; i; --i) { //Ó²±ÒÖÖÀà
   int t = min(A / v[i], c[i]);
   A -= t * v[i];
   ans += t;
}

若是硬币的面额是任意的,那么这就是个背包了。是个DP。详见看我的题解POJ1742.

2.区间问题

给定n个区间,求选取两两不相交区间.
我们不妨给定几个贪心方法
1.在可选的区间,每次都选开始左端点的。
2.在可选的区间,每次都选右端点最小的。
3.在可选的区间,每次都选长度最短的。
4.在可选区间,每次都选取与最少与可选区间重叠最小的区间。

1的反例

1111111111111111111111111
  222222 3333333

3的反例

11111111111 22222222222
       3333333

4反例

  111     111
  111     111
  111 111 111
111 111 111 111

所以按照右端点排序是对的咯。

sort(p + 1, p + 1 + n);
	int now = 0, ans(0);

	rep(i, 1, n) {
		if(p[i].l >= now) {
			now = p[i].r;
			ans++;
		}
	}

3.字典序最小

本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15126944.html

原文地址:https://www.cnblogs.com/QQ2519/p/15126944.html