UVA - 10020 Minimal coverage

题目大意:给你 N 条线段(Li,Ri)映射到x轴上,然后让你用其中的几条线段(条数最少)覆盖【0,M】


解题思路:左范围从 0 开始向右扩大,直到大于 m,每次都找能到达最右边的那个范围,更新到输出序列中,如果不能再扩大且小于 m 说明无法完全覆盖。

#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)