相容问题

问题

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

解析

共有10项活动,开始时间和结束时间分别为

{(1,4),(3,5),(5,7),(0,6),(3,8),(5,9),(8,11),(6,10),(8,12),(2,13),(12,14)}

  1. 如果按照每项活动的结束时间从小到大排序后的顺序进行。

则顺序为{(1,4),(3,5),(0,6),(5,7),(3,8),(5,9),(6,10),(8,11),(8,12),(2,13),(12,14)},则可以安排的活动有4个,分别为(1,4),(5,7),(8,11),(12,14)

  1. 如果按照每项活动的开始时间从小到大排序后的顺序进行。

则顺序为{(0,6),(1,4),(2,13),(3,5),(3,8),(5,7),(5,9),(6,10),(8,11),(8,12),(12,14)},则可以安排的活动有3个,分别为(0,6),(6,10),(12,14)

  1. 如果按照每项活动的占用时间从小到大排序后的顺序进行。

则顺序为{(3,5),(5,7),(12,14),(1,4),(8,11),(5,9),(6,10),(8,12),(3,8),(0,6),(2,13)},则可以安排的活动有3个,分别为(3,5),(5,7),(12,14)

设计

按照每项活动的结束时间从小到大排序后的顺序进行即可。

分析

sort函数自定义排序,复杂度为O(NlogN);遍历一遍数组,复杂度为O(N)。因此总复杂度为O(N+NlogN)

/*
author: keke
project name:相容问题
Time Complexity: O(nlog(n))
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
const int maxn=110;
int n,m,t,is,cnt,ans;
struct xx{
    int l,r;
}xx[maxn];
bool cmp(struct xx a,struct xx b){
    if(a.r==b.r)return a.l<b.l;
    return a.r<b.r;
}
int main(){
    ios::sync_with_stdio(false);
    cout<<fixed<<setprecision(2);
    while(cin>>n){
        if(!n)return 0;
        int ans=0,cnt=0;
        for(int i=1;i<=n;i++)cin>>xx[i].l>>xx[i].r;
        sort(xx+1,xx+1+n,cmp);
        for(int i=1;i<=n;i++){
            if(cnt<=xx[i].l){
                ++ans;
                cnt=xx[i].r;
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
    //good job!
}

猜你喜欢

转载自www.cnblogs.com/powerkeke/p/12923064.html