「一本通 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;
}
posted @ 2018-12-24 17:47 schrodingercatss 阅读(...) 评论(...) 编辑 收藏