请问这个是什么模型?一般用什么算法解决?

时间:2021-03-19 03:39:02
题如下,比如一群人参与一个工作:

1. 每个人都有开始时间Si和结束时间Fi
2. 每个人开始后无法停留,必须坚持到结束
3. 每次只能一个人运作,就是说下一个必须在前一个完成后才能上

问:
1. 最长时间
2. 最多参与人数

eg:

输入:
3
0 5
0 1
1 3

表示:3人参与,第一人是0时开始,5时结束,依次类推...

数轴表示就是:
0__1__2__3__4__5
0__1
   1__2__3


输出:
最长时间:5 (0-5)
最多人数:2 (0-1;1-3)

6 个解决方案

#1


类似活动选择问题,第1问需要动态规划,第2问可以用贪心算法。

#2


将这n个活动按结束时间由小到大排序之后,假设此时有F(1)<=F(2)<=...<=F(n)

1.最长时间
用dp(i,T)来表示在时间T之前完成的、前i个活动所能安排的最长时间。那么状态转移方程:
if( F(i)>T )
    dp(i,T)=dp(i-1,T);
else
    dp(i,T)=max{ dp(i-1,T),F(i)-S(i)+dp(i-1,S(i)) };
最后dp(n,F(n))就是题目解。

2.最多参与人数
1)优先选结束时间最早的人;
2)将被选择的人、与刚才选择有冲突的人统统去掉,在剩下的数据中重复1)直到过程结束。
证明过程不再赘述,网上有很多。

#3


帮忙顶一下,让了解的人来解答.

#4


引用 2 楼 dlyme 的回复:
将这n个活动按结束时间由小到大排序之后,假设此时有F(1) <=F(2) <=... <=F(n)

1.最长时间
用dp(i,T)来表示在时间T之前完成的、前i个活动所能安排的最长时间。那么状态转移方程:
if( F(i)>T )
dp(i,T)=dp(i-1,T);
else
dp(i,T)=max{ dp(i-1,T),F(i)-S(i)+dp(i-1,S(i)) };
最后dp(n,F(n))就是题目解。

2.最多参与人数
1)优先选结束时间最早的人;
2)将被选择的人、与刚才选择有冲突的人统统去掉,在剩下的数据中重…


感谢,想起来了!!!嘿嘿,去写下先~等下放分!

#5


哎,帮顶!

#6


Mark...

#1


类似活动选择问题,第1问需要动态规划,第2问可以用贪心算法。

#2


将这n个活动按结束时间由小到大排序之后,假设此时有F(1)<=F(2)<=...<=F(n)

1.最长时间
用dp(i,T)来表示在时间T之前完成的、前i个活动所能安排的最长时间。那么状态转移方程:
if( F(i)>T )
    dp(i,T)=dp(i-1,T);
else
    dp(i,T)=max{ dp(i-1,T),F(i)-S(i)+dp(i-1,S(i)) };
最后dp(n,F(n))就是题目解。

2.最多参与人数
1)优先选结束时间最早的人;
2)将被选择的人、与刚才选择有冲突的人统统去掉,在剩下的数据中重复1)直到过程结束。
证明过程不再赘述,网上有很多。

#3


帮忙顶一下,让了解的人来解答.

#4


引用 2 楼 dlyme 的回复:
将这n个活动按结束时间由小到大排序之后,假设此时有F(1) <=F(2) <=... <=F(n)

1.最长时间
用dp(i,T)来表示在时间T之前完成的、前i个活动所能安排的最长时间。那么状态转移方程:
if( F(i)>T )
dp(i,T)=dp(i-1,T);
else
dp(i,T)=max{ dp(i-1,T),F(i)-S(i)+dp(i-1,S(i)) };
最后dp(n,F(n))就是题目解。

2.最多参与人数
1)优先选结束时间最早的人;
2)将被选择的人、与刚才选择有冲突的人统统去掉,在剩下的数据中重…


感谢,想起来了!!!嘿嘿,去写下先~等下放分!

#5


哎,帮顶!

#6


Mark...