【贪心算法】舞蹈室的安排

描述:

新活有个舞蹈室,并且只有一个舞蹈室,假设申请时间以小时为单位,每天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行

Step1: 对时间区间按照结束时间升序排序

Step2: 先结束先安排

#include<iostream>
using namespace std;

struct Time
{
	int low;
	int top;
};

void swap(Time a[], int j)
{
	Time temp = a[j];
	a[j] = a[j + 1];
	a[j + 1] = a[j];
}

int main()
{
	int m;
	cin >> m;
	while (m-- > 0)
	{
		int n;
		cin >> n;
		Time* a = new Time[n];

		//输入
		for (int i = 0; i < n; i++)
			cin >> a[i].low >> a[i].top;

		//冒泡排序
		for (int i = 0; i < n - 1; i++)
			for (int j = i - 1; j >= 0 && a[j].top > a[j + 1].top; j--)
				swap(a, j);

		int count = 1;
		//先结束先安排
		for (int i = 1; i<n; i++)
			if (a[i].low>a[i - 1].top)count++;

		cout << count << endl;

		delete a;
	}

	return 0;
}

  

时间: 2024-12-17 09:51:57

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

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

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

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

问题表述:设有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相容. 由于输入的活动以其完成时间的非减序排列,所以算法

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

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

51nod贪心算法入门-----活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 我们可以知道先安排最早结束的活动可以更多的安排活动.首先就是将所有的活动结束时间按先后顺序给排序:然后以结束时间为线索

51nod贪心算法入门-----活动安排问题2

题目大意就是给几个活动,问要几个教室能够弄完. 这个题目的想法就是把活动的开始——结束的时间看做是数轴上的一段线段,教室的个数就是在某点的时间厚度,求最大的时间厚度就是所需要的教室个数. 1 #include<stdio.h> 2 #include<iostream> 3 #include<stdlib.h> 4 #include<queue> 5 using namespace std; 6 struct node 7 { 8 int start; 9 i

C++贪心算法实现活动安排问题

_(:з」∠)_ 1 #include <cstdio> 2 #include <iostream> 3 #include <ctime> 4 #include <windows.h> 5 #include <algorithm> 6 #include <fstream> 7 using namespace std; 8 struct activity 9 { 10 int no; 11 int start; 12 int finis

1、贪心算法

body { font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 10.5pt; line-height: 1.5; }html, body { }h1 { fo

【贪心算法】舞蹈室安排

Description 新活有个舞蹈室,并且只有一个舞蹈室,假设申请时间以小时为单位,每天24个小时,每周就是168小时,我们规定申请时间从每周一的0点开始递增,比如申请时间区间为[1,24]就代表周一的0点到24点,时间区间[25,48]就代表周二的0点到24点,以此类推. 现在假定你是舞蹈室的管理人员,面对一批使用舞蹈室的申请,你希望舞蹈室能尽可能给更多人使用(也就是尽可能满足更多申请数量,请注意,这里要求的并不是舞蹈室被使用的时间最多,而是被批准的申请数量最多),请你写一个程序判断这批申请

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

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

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

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