贪心算法(Greedy Algorithm)

简介 (Introduction)

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。



描述(Description)

  • 贪心是一种在每次决策是都采取当前意义下最优策略的算法
  • 贪心法要求问题的整体最优性可以由局部最优性导出
  • 无法使用贪心算法,如:背包问题

  • 贪心算法可行性证明:
    1. 临项交换(排序)
    2. 决策范围拓展
    3. 反证法
    4. 数学归纳



应用(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;
    }
    

posted @ 2023-06-10 12:25  FFex  阅读(7)  评论(0编辑  收藏  举报