算法分析设计实践——相容问题

问题:

有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。

解析:

首先以开始时间的进行排序,选择尽可能早开始的节目

遇到如上图这种情况时,则选择较迟开始的节目更优,因此以开始时间进行排序错误

其次以节目时间的长短进行排序,尽可能选择节目时间短的节目

遇到如上图这种情况时,则选择时间较长的两个节目更优,因此节目时间长短进行排序错误

以结束时间的早晚进行排序,尽可能选择结束时间较早的节目,目的是能够给后面的节目留下更多时间

设计:

 1 struct node
 2 {
 3     int s, e;
 4     // s代表节目的开始时间, e代表结束时间
 5 }p[maxn];
 6 int n;
 7 int cmp(node& a, node& b)
 8 {
 9     return a.e < b.e;
10 }

分析:

时间复杂度:O(nlogn)

源码:

 1 #include<cstdio>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<vector>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 #include<cctype>
11 #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
12 #define mem(a,x) memset(a,x,sizeof(a))
13 #define lson rt<<1,l,mid
14 #define rson rt<<1|1,mid + 1,r
15 #define P pair<int,int>
16 #define ull unsigned long long
17 using namespace std;
18 typedef long long ll;
19 const int maxn = 5e5 + 10;
20 const ll mod = 998244353;
21 const int inf = 0x3f3f3f3f;
22 const long long INF = 0x3f3f3f3f3f3f3f3f;
23 const double eps = 1e-7;
24 
25 struct node
26 {
27     int s, e;
28     // s代表节目的开始时间, e代表结束时间
29 }p[maxn];
30 int n;
31 int cmp(node& a, node& b)
32 {
33     return a.e < b.e;
34 }
35 
36 int main()
37 {
38     scanf("%d", &n);
39     for (int i = 1; i <= n; ++i)
40     {
41         scanf("%d %d", p[i].s, p[i].e);
42     }
43     sort(p + 1, p + 1 + n, cmp);
44     int ans = 0, end = 0;
45     for (int i = 1; i <= n; ++i)
46     {
47         if (p[i].s >= end)
48         {
49             ans++;
50             end = p[i].e;
51         }
52     }
53     printf("%d\n", ans);
54 
55     return 0;
56 }
完整代码

https://github.com/BambooCertain/Algorithm.git

posted @ 2020-05-18 20:52  当然是斗笠呀  阅读(184)  评论(0编辑  收藏  举报