活动安排问题(贪心)

Description

设有n个活动的集合E={1, 2, ..., n},其中,每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi ,且si < fi。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。也就是说,当 sifjsjfi 时,活动 i 与活动 j 相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。

Input

输入的第一个为测试样例的个数T,接下来有T个测试样例。

每个测试样例的第一行是一个整数nn ≤ 1000 ),表示有n个活动。

接下来n行,每行两个整数 sifi 表示第 i 个活动的起始时间和结束时间。

Output

对应每个测试样例输出一行,格式为"Case #: D",其中'#'表示第几个测试样例(从1开始计),D为最大的相容活动子集合的活动数量。

Sample Input

1
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

Sample Output

Case 1: 4

 

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct action{
    int s ; //活动开始时间
    int f ; //活动结束时间
};
action a[1001];
bool cmp(const action &a,const action &b){

    if(a.f<=b.f)return true;
    else return false;
}
int  Selector(int n,action a[]){
    int sum=1;
    int preEnd = 1;
    for ( int i =2;i<=n;i++){
        if(a[i].s>=a[preEnd].f){
            sum++;
            preEnd = i;
        }
    }
    return sum;
}
int main(){
    int T,n;
    cin >> T ;
    for(int i=1;i<=T;i++){
        cin >> n;
        for(int j=1;j<=n;j++){
            cin >> a[j].s >> a[j].f;
        }
        sort(a,a+n+1,cmp);
        int sum = Selector(n,a);
        cout << "Case " << i << ": "<< sum <<endl;
    }
}

 

posted @ 2018-01-08 15:33  的川  阅读(442)  评论(0编辑  收藏  举报