zoukankan      html  css  js  c++  java
  • 活动安排问题(贪心)

    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;
        }
    }
  • 相关阅读:
    mysql 5.7 安装手册(for linux)
    Git服务器分类
    Git服务器安装详解及安装遇到问题解决方案
    使用git进行版本管理
    Git 忽略一些文件不加入版本控制
    Windows下搭建基于SSH的Git服务器
    linux系统下mysql跳过密码验证登录和创建新用户
    阅读《不止代码》之心得分享
    Sonar安装和常见问题解决
    Eclipse安装Sonarlint插件
  • 原文地址:https://www.cnblogs.com/dichuan/p/8213544.html
Copyright © 2011-2022 走看看