活动选择
题目描述
学校在最近几天有 n 个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
现在给出 n 个活动使用礼堂的起始时间 Bi 和结束时间 Ei(Bi < Ei),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。
输入
第一行一个整数 n(n<=1000);
接下来的 n 行,每行两个整数,第一个 Bi,第二个是 Ei(Bi< Ei <=32767)
输出
输出最多能安排的活动个数。
样例输入
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
样例输出
4
分析:每一个活动都有一个结束时间,所以我们只要想办法让这个活动尽可能早的结束,这样好余下更多的时间举办别的活动。
所以我们只要按每一个活动的结束时间从小到大排序,然后选择在前一个活动结束后尽可能早开始的活动,这样选择出来的活动一定是最多的。
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define rep(i, a, n) for(int i = a; i <= n; ++i) #define per(i, n, a) for(int i = n; i >= a; --i) typedef long long ll; const int maxn = 1e3 + 5; struct Node { int sta, end; bool operator < (const Node& other)const { return end < other.end; } }a[maxn]; int n, ans = 0; int fini = 0; //记录当前最后一个活动的结束时间 int main() { freopen("act.in", "r", stdin); freopen("act.out", "w", stdout); scanf("%d", &n); rep(i ,1, n) scanf("%d%d", &a[i].sta, &a[i].end); sort(a + 1, a + n + 1); rep(i, 1, n) { if(a[i].sta >= fini) { ans++; fini = a[i].end; } } printf("%d\n", ans); return 0; }