【贪心算法】舞蹈室安排

Description

新活有个舞蹈室,并且只有一个舞蹈室,假设申请时间以小时为单位,每天24个小时,每周就是168小时,我们规定申请时间从每周一的0点开始递增,比如申请时间区间为【1,24】就代表周一的0点到24点,时间区间【25,48】就代表周二的0点到24点,以此类推。

现在假定你是舞蹈室的管理人员,面对一批使用舞蹈室的申请,你希望舞蹈室能尽可能给更多人使用(也就是尽可能满足更多申请数量,请注意,这里要求的并不是舞蹈室被使用的时间最多,而是被批准的申请数量最多),请你写一个程序判断这批申请里面最多能有多少个能被满足。比如有下列两个申请:

【10,12】

【11,160】

由于同一时刻舞蹈室只能给一个申请使用,所以这两个申请最多只能满足1个。

又如以下三个申请:

【10,12】

【155,168】

【11,160】

由于要求是让更多的申请能通过审批,所以我们选择的是【10,12】和【155,168】这两个区间,而不是【11,160】这个区间,所以结果是2。

Input

第一行是一个数字n,代表接下来有n个测试用例。

对于每一个测试用例,格式如下:

第一行是一个数字m,代表本周有m个申请,0 < m < 150。

接下来的m行,每行有两个数字,中间用空格隔开,代表该申请的时间区间(注意时间区间都是闭区间,且时间区间一定合法,不会超出【1,168】之外)

Output

每个测试用例输出一行,只有一个数字,代表最多能满足的申请个数。

对于这n个测试用例,输出总共有n行

Sample Input

2
2
10 12
11 160
3
10 12
155 168
11 160

Sample Output

1
2

解题思路:贪心算法的选择不相交区间问题。1.用一个结构体TIME表示区间,对区间按照结束时间进行排序;2.先结束的都可以进行安排(且不与已经安排的冲突),这样安排的活动才会尽可能多。

实现代码:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;

struct TIME {
    int b, e;
};

int main() {
    int n, m, i, j, count;
    TIME T[150];
    TIME tmp;
    cin >> n;
    for (; n > 0; n--) {         //n个测例
        cin >> m;
        for (j = 0; j < m; j++) {
            cin >> T[j].b;
            cin >> T[j].e;
        }

        for (j = 0; j < m - 1; j++)
            for (i = 0; i < m - 1 - j; i++) {
                if (T[i].e >= T[i + 1].e) {    //按结束时间进行升序排序
                    tmp = T[i];
                    T[i] = T[i + 1];
                    T[i + 1] = tmp;
                }
            }

        for (i = 0, count = 0; i < m; i++) {
            if (i == 0) {
                count++;
                tmp = T[i];
                continue;
            }
            if (T[i].b > tmp.e) {    //下一个开始时间大于上一个安排的结束时间
                tmp = T[i];          //这个活动就可以进行安排
                count++;
            }
        }

        cout << count << endl;
    }
}            

(本博文或多或少参考过其他网上资料,但时间已久忘记当初的参考了,在此对他们表示感谢!)

时间: 2024-10-12 13:46:05

【贪心算法】舞蹈室安排的相关文章

贪心算法-活动安排问题

活动安排问题 问题描述 有n个需要使用同一资源的活动,且在同一时段只有一个活动能使用该资源. 每个活动i都有一个起始时间 si 和结束时间 fi ,且 si < ei .如果选择了活动 i,则它在半开时间区间 [si,ei) 内占用资源.若区间 [si, ei) 与区间 [sj,ej) 不相交,则称活动 i 与活动 j 是相容的. 该问题就是要安排这些活动使得尽量多的活动能不冲突地举行. 归纳: 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合. 解题思路 每次总是选择具有最早完成时

算法设计与分析(三)贪心算法--活动安排问题

活动安排问题https://blog.csdn.net/qq_40452317/article/details/88875384 贪心算法汇总--喷水装置问题.会场安排问题.过河问题https://blog.csdn.net/liujiuxiaoshitou/article/details/69728714 原文地址:https://www.cnblogs.com/yasheng/p/12517250.html

贪心算法--活动安排

1 package cn.it; 2 3 import java.util.Arrays; 4 5 public class Tx { 6 public static void main(String[] args) { 7 int start[]={1,4,2,1,2,4,5}; 8 int end[]={5,6,3,2,4,5,6}; 9 int n=6; 10 boolean a[]= new boolean[n]; 11 sort(start,end,n); 12 int count =

区间图着色问题(贪心算法的解法)

问题描述:假设要用很多个教室对一组活动进行调度.我们希望使用尽可能少的教室来调度所有活动.请给出一个算法,来确定哪一个活动使用哪一间教室.这个问题也被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色数最少. 解法思想: 其实我们知道,对于单个教室我们可以用贪心算法进行求解,但是对于这个区间图的问题,我们采用的方法是多次的贪心.其实你想想看,你无非就是要使那些活动 全部被安排完吧,当然这样安排的方法很多,如何使得安排后的教室最小呢???? 这明显也是个贪心的问题.聪明的人很

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si >= fj或sj >= fi时,活动i与活动j相容. 由于输入的活动以其完成时间的非减序排列,所以算法

贪心算法-----单线程:活动安排问题 多线程:多机调度问题

一.贪心算法的特点 顾名思义,贪心算法总是做出在当前看来是最好的选择.虽然贪心算法并不从整体最优上加以考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的优点是更简单,更直接且解题效率更高,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好的近似解. 二.贪心算法的理解 由于涉及到在做出在当前看来最好的选择,所以会经常采用排序算法,推荐使用快速排序算法,复杂度是O(nlgn),且在同等复杂度算法中效率是最高的, 本文涉及的排序都采用冒泡排序,只是注明需要排序而已. 贪心算法

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活

活动安排问题(贪心算法)

问题描述: 有n个活动的活动集合E ,其中每一个活动都要求使用同一个资源,而在同一个时刻内资源只能被一个活动使用,每一个活动都有开始是时间和结束时间,要求从活动集合E中选出m个活动,使着m个活动都能顺利进行,即也就是每个活动的活动时间都互相不交叉,求m的最大值和 被选中的活动序号. 例如输入: 活动编号   活动开始时间    活动结束时间 1                1                       4 2                3                 

贪心算法解决会场安排问题

贪心算法解决会场安排问题. [问题描述] 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数.) [数据输入] 由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动. 接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间. [结束输出] 输出最少会场数. input.txt