算法分析设计实践——相容问题
问题:
有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