目录
1.问题
2.解析
其他贪心策略:
1) 按开始时间从小到大排序,使得s1<=s2<=...<=sn,然后从前向后挑选,只要与前面的内容相容,就可以把这项活动选入A
实例:已按开始时间从小到大排序(与第一个方法样例相同)
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
s | 1 | 3 | 2 | 5 | 4(4>=4:与活动1相容) | 5 | 6 | 8 | 8 | 2 |
f | 4(活动1) | 5 | 6 | 7 | 9(活动2) | 9 | 10 | 11 | 12 | 13 |
k=2<3,所以用此方法得出的结果不是最优的,这是此方法的一个反例
2)按每个活动的占用时间从小到大排序,使得t1<=t2<=...tn(tn=fn-sn),然后从前向后挑选,只要与前面的内容相容,就可以把这项活动选入A
实例:已按活动占用时间从小到大排序(与第一个方法样例不同)
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
t | 1 | 2 | 2 | 3 | 4 | 4 | 4 | 4 | 5 | 11 |
s | 8 | 3 | 5 | 1 | 2 | 5 | 6 | 8 | 4 | 2 |
f | 9(活动1) | 5 | 7 | 4 | 6 | 9 | 10 | 12 | 9 | 13 |
k=1
此样例按截止时间升序排序
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
s | 1 | 3 | 2 | 5(5>=4:与活动1相容) | 4 | 5 | 8(8>=7:与活动2相容) | 6 | 8 | 2 |
f | 4(活动1) | 5 | 6 | 7(活动2) | 9 | 9 | 9(活动3) | 10 | 12 | 13 |
k=3
所以按活动占用时间从小到大排序不是最优的,此样例是一个反例
3.设计
struct node {
int s, f;
}t[maxn], ans[maxn];//t数组存储初始时间,ans存储使活动数量最多的时间安排
int main() {
input;
按截止时间f从小到大排序;
k = 1;
ans[1] = t[1];
for i = 2 to n do
if t[i].s >= ans[k].f
then ans[++k] = t[i];
output;
}
4.分析
O(n)