算法笔记 贪心算法练习题(1)

算法笔记 贪心算法练习题(1)

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解决此类问题时,需要注意判断该问题的最佳解是否由局部最优解构成,如若不是则不能采用贪心算法。

题目描述

暑假到了,小明终于可以开心的看电视了。但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目。
现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?

输入

输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。
当n=0时,输入结束。

输出

对于每组输入,输出能完整看到的电视节目的个数。
样例输入
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0
样例输出
5


首先对该问题进行分析,得知所求结果应为最多个节目播放问题。抽象模型为区间选择的贪心算法。每次得出的局部最优解的组合将构成全局最优解,所以使用贪心算法可行。

#include
#include
#include
using namespace std;
const int maxn = 101;
struct Inteval {
	int x, y;//x为开始时间,y为结束时间
}I[maxn];
// 排序,将所有区间按照开始时间最晚,结束时间最短进行排列(左端点最大,右端点最小)
 //这一方法可以看作从最后一个可看的节目往前找,找到可以看的节目
    bool cmp(Inteval a, Inteval b) {
    	if (a.x != b.x) {
    		return a.x > b.x;
    	}
    	else {
    		return a.y < b.y;
    	}
    }
    int main() {
    	int n;
    	while (cin >> n) {
    		if (n == 0)
    			break;
    		for (int i = 0; i < n; i++) {
    			cin >> I[i].x >> I[i].y;
    		}
    		sort(I, I + n, cmp); 
    		int ans = 1, lastX = I[0].x;//最近的左端点
    		for (int i = 1; i < n; i++) {
    		//如果最近的左端点大于等于前一段时间的右端点,说明I[i]可以作为前一个观看的节目
    			if (I[i].y <= lastX) {
    				lastX = I[i].x;//将左端点设置为I[i]的左端点
    				ans++;
    			}
    		}
    		cout << ans << endl;
    	}
    	//system("pause");
    }

参考算法笔记122页 区间贪心
可能上面那个不适合正常思维,于是我改了一下,我们从最早的节目开始看,依次往后找,看有没有合适的可以看的节目。这个只需要找右端点就好了,其他和上面的基本没啥差别。

#include
#include
#include
using namespace std;
const int maxn = 101;
struct Inteval {
	int x, y;//x为开始时间,y为结束时间
}I[maxn];
bool cmp(Inteval a, Inteval b) {
		return a.y < b.y;
}
int main() {
	int n;
	while (cin >> n) {
		if (n == 0)
			break;
		int ans = 1;
		for (int i = 0; i < n; i++) {
			cin >> I[i].x >> I[i].y;
		}
		sort(I, I + n, cmp);
		int miny = I[0].y;
		for (int i = 1; i < n ; i++) {
			if (I[i].x >=miny ) {
				ans++;
				miny = I[i].y;

			}
		}
		cout << ans << endl;
	}
	//system("pause");
}

你可能感兴趣的:(小菜鸡学算法,算法,贪心)