《算法分析与设计》作业10----相容问题(贪心法)

目录

 

1.问题

2.解析

3.设计

4.分析

5.源码


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)

5.源码

GitHub地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值