贪心算法(1):活动安排问题

悠悠 2022-02-05 10:21 506阅读 0赞

题目

设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si ,fi )内占用资源。若区间[si ,fi )与区间[sj,fj )不相交,则称活动i与活动j是相容的。当 si ≥ fj 或 sj ≥ fi 时,活动i与活动j相容活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。
输入活动数,每个活动的开始结束时间,输出最大相容活动数。

输入:

5
1 2
3 4
5 6
1 4
3 7
输出:
3

题解

首先,将这些活动按照结束时间从小到大排序(不是光把结束时间排序),因为贪心在于每次找的活动都尽可能为后面的活动留更多的时间,然后遍历数组找出所有相容活动。

c++代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. #define N 100
  6. #define true 1
  7. #define fales 0
  8. struct A
  9. {
  10. int s;
  11. int f;
  12. };
  13. bool cmp(A a1,A a2)
  14. {
  15. return a1.f<a2.f;
  16. }
  17. void select(int n,A a[]) {
  18. int j=0;
  19. int sum=1;
  20. for(int i=1; i<n; i++) {
  21. if(a[i].s>=a[j].f) {
  22. j=i;
  23. sum++;
  24. }
  25. }
  26. cout<<sum;
  27. }
  28. int main() {
  29. int n;
  30. cin>>n;
  31. A a[n];
  32. for(int i=0; i<n; i++) {
  33. scanf("%d",&a[i].s);
  34. scanf("%d",&a[i].f);
  35. }
  36. sort(a,a+n,cmp);
  37. select(n,a);
  38. }

发表评论

表情:
评论列表 (有 0 条评论,506人围观)

还没有评论,来说两句吧...

相关阅读

    相关 活动安排问题(贪心)

    活动安排问题(贪心) 有若干个活动,第i个开始时间和结束时间是\[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input

    相关 贪心算法1):活动安排问题

    题目 设有n个活动的集合E=\{1,2,…,n\},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源每个活动i都有一个要求使用该资源