uva 10020 Minimal coverage(贪心-最小覆盖问题)

题目大意:给出一个范围M,然后给出若干的区间,以0 0 终止, 要求用最少的区间将0 ~M 覆盖,输出最少个数以及方案。


解题思路:典型的区间覆盖问题,算法竞赛入门经典P154上有讲。

#include <cstdio>

int main() {
	int T, arr[100005][2], ans[100005];
	scanf("%d", &T);

	while (T--) {
		int m, n, cnt, cur, s;
		scanf("%d", &m);
		for (n = 0; scanf("%d%d", &arr[n][0], &arr[n][1]), arr[n][0] || arr[n][1]; n++);

		for (cur = cnt = 0; cur < m; cnt++, cur = s) {
			s = cur;
			for (int i = 0; i < n; i++)
				if (arr[i][0] <= cur && arr[i][1] > s) {
					s = arr[i][1];
					ans[cnt] = i;
				}

			if (s == cur) {
				cnt = 0;
				break;
			}
		}

		printf("%d\n", cnt);
		for (int i = 0; i < cnt; i++)
			printf("%d %d\n", arr[ans[i]][0], arr[ans[i]][1]);
		printf(T ? "\n" : "");
	}
	return 0;
}


你可能感兴趣的:(uva 10020 Minimal coverage(贪心-最小覆盖问题))