「一本通 1.1 例 1」活动安排
解题思路
由于在同一时间内只有一个活动能使用这一资源,所以我们需要找到一个最优策略,使得能进行的活动数目最多。
贪心策略:我们对所有的活动进行按结束时间从小到大排序,这样使得每一个选中的活动尽量靠近时间轴左端,而结束时间相同,我们按起始时间从大到小排序,这样使得选中的每一个活动都尽量靠近时间轴右端,这样,每一个活动的区间长度都会最小,从而得到整体最优解。
选择策略:选择第一个活动作为初始活动,遍历剩下的排完序的每一个活动,当下一个活动的起始时间大于等于前一个活动的结束时间是,这个活动就会被选中,否则跳过该活动。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int>P;
P arr[1005];
bool cmp(P a, P b)
{
if(a.second == b.second) return a.first > a.first;
return a.second < b.second;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; ++i) cin >> arr[i].first >> arr[i].second;
sort(arr, arr + n, cmp);
int last = arr[0].second;
int cnt = 1;
for(int i = 1; i < n; ++i) {
if(arr[i].first >= last) {
cnt++;
last = arr[i].second;
}
}
cout << cnt << endl;
return 0;
}