贪心算法(Greedy Algorithm)
简介 (Introduction)
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。
描述(Description)
- 贪心是一种在每次决策是都采取当前意义下最优策略的算法
- 贪心法要求问题的整体最优性可以由局部最优性导出
- 无法使用贪心算法,如:背包问题
- 贪心算法可行性证明:
- 临项交换(排序)
- 决策范围拓展
- 反证法
- 数学归纳
应用(Application)
防晒
有 \(C\) 头奶牛进行日光浴,第 \(i\) 头奶牛需要 \(minSPF[i]\) 到 \(maxSPF[i]\) 单位强度之间的阳光。
每头奶牛在日光浴前必须涂防晒霜,防晒霜有 \(L\) 种,涂上第 \(i\) 种之后,身体接收到的阳光强度就会稳定为 \(SPF[i]\),第 \(i\) 种防晒霜有 \(cover[i]\) 瓶。
求最多可以满足多少头奶牛进行日光浴。
输入格式
第一行输入整数 \(C\) 和 \(L\)。
接下来的 \(C\) 行,按次序每行输入一头牛的 \(minSPF\) 和 \(maxSPF\) 值,即第 \(i\) 行输入 \(minSPF[i]\) 和 \(maxSPF[i]\)。
再接下来的 \(L\) 行,按次序每行输入一种防晒霜的 \(SPF\) 和 \(cover\) 值,即第 \(i\) 行输入 \(SPF[i]\) 和 \(cover[i]\)。
每行的数据之间用空格隔开。
输出格式
输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。
数据范围
\(1 \le C,L \le 2500\),
\(1 \le minSPF \le maxSPF \le 1000\),
\(1 \le SPF \le 1000\)
输入样例:
3 2
3 10
2 5
1 5
6 2
4 1
输出样例:
2
- 题解:
// C++ Version #include <iostream> #include <algorithm> using namespace std; const int N = 2510; struct node { int minspf, maxspf; } a[N]; struct Node { int spf; int cover; } b[N]; bool cmp(node a, node b) { if (a.minspf != b.minspf) return a.minspf > b.minspf; return a.maxspf > b.maxspf; } bool cmp1(Node a, Node b) { return a.spf > b.spf; } int main() { int c, l; cin >> c >> l; for (int i = 0; i < c; i ++)cin >> a[i].minspf >> a[i].maxspf; for (int i = 0; i < l; i ++)cin >> b[i].spf >> b[i].cover; sort(a, a + c, cmp); sort(b, b + l, cmp1); int cnt = 0; for (int i = 0; i < c; i ++ ) for (int j = 0; j < l; j ++ ) if (b[j].cover > 0 && b[j].spf >= a[i].minspf && b[j].spf <= a[i].maxspf) { b[j].cover -- ; cnt ++ ; break; } cout << cnt << endl; return 0; }