题目
分析1
区间问题,为了看尽量多的完整节目,需要确定一个选择策略。
(1)在可选的节目中(和目前已选的节目不重叠的节目),每次都选取开始时间最早的;
(2)在可选的节目中,每次都选取结束时间最早的;
(3)在可选的节目中,每次都选取时长最短的;
(4)在可选的节目中,每次都选取与最少可选节目有重叠的;
对于以上选法的取舍,可以尝试排除法。
(1)[0, 7] [1, 3] [3, 4] -> 1([0, 7]) ×
(3)[0, 7] [8, 18] [6, 9] -> 1([6, 9]) ×
(4)[0, 2] [2, 4] [4, 6] [6, 8] [1, 3] [3, 5] [5, 7] [1, 3] [1, 3] [5, 7] [5, 7]
关于贪心算法的证明,即结束时间越早,之后可选的节目也就越多。
(1)归纳证明,在选取了相同数量的更早开始的节目时,其最终结束时间不会比其他方案的更晚;
(2)反证证明,此时不存在选取更多节目的选择方案。
代码
#include <stdio.h>
#define N 101
int t[N][2];
int solve(int n)
{
int i, j, tmp[2], s = 0, r = 0;
for (j = 0; j < n-1; j++)
for (i = 0; i < n-1 - j; i++)
if (t[i][1] > t[i+1][1]) {
tmp[0] = t[i][0]; tmp[1] = t[i][1];
t[i][0] = t[i+1][0]; t[i][1] = t[i+1][1];
t[i+1][0] = tmp[0]; t[i+1][1] = tmp[1];
}
for (i = 0; i < n; i++)
if (s <= t[i][0]) {
r++;
s = t[i][1];
}
return r;
}
int main(void)
{
int n, i;
while (scanf("%d", &n), n) {
for (i = 0; i < n; i++)
scanf("%d%d", &t[i][0], &t[i][1]);
printf("%d\n", solve(n));
}
return 0;
}