算法题目:活动调度

活动调度

一.题目要求:输入要求:

第一行为活动的个数 N(1<=N<=1 000 000) 。

接下来 N 行为 Si 和 Fi(0<=Si<Fi<=2 000 000 000) ,分别代表第 i 个活动的开始时间和结束时间。活动 i 的区间段为 [Si,Fi)

输出要求:

输出有一行 M ,为所需教室的最小数量。

二.题目分析
本人看了几篇借题报告总结了一下比较好的思想。我们可以想象每个活动是时间轴一条线段,开始时间为线段

起点,结束时间为线段终点,时间轴上任意一点,比如 t 点,这一点被 n 条线段覆盖,则在这一时间

点上至少需要n间教室,则整个时间轴上所有点的n的最大值即为答案。

三.实现方法
想象从时间轴0处向无穷处出发,遇到一个线段的起点,则占用教室+1,遇到一个终点,则-1,遍历过程中更

新这个占用的最大值。我的代码把起点和终点放在一起排列,用flag标记起点还是终点,这里要特别注意的

是,当起点时间和终点的时间一样时,要把终点排在前面,原因就请你来思考一下了。哈哈?

下面是AC代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node//用来存每一个时间节点
{
	long long time;
	int flag;//-1表示此点为起点,+1表示为终点
}T[2000006];
bool cmp(struct node x, struct node y)
{
	if (x.time != y.time)
		return x.time < y.time;
	else//特别注意此处
		return x.flag > y.flag;
}
int main()
{
	int n;
	int sum = 0,ans=0;//sum用来记录时间节点数,ans为最终的答案
	long long start, end;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%lld %lld", &start, &end);
		T[sum].time = start;	T[sum++].flag = -1;
		T[sum].time = end;		T[sum++].flag = 1;
	}
	sort(T, T + sum, cmp);
	int temp = 0;
	for (int i = 0; i < sum; i++)
	{
		if (T[i].flag == -1)
			temp++;
		else if (T[i].flag == 1)
			temp--;
		if (temp > ans)//更新最大值
			ans=temp;
	}
	printf("%d\n", ans);
	return 0;
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对你的第二个问题,我可以为你提供以下内容: 磁盘调度算法是操作系统中的重要部分之一,它的主要作用是优化磁盘的访问速度,提高系统的性能。常见的磁盘调度算法有以下几种: 1. 先来先服务算法(FCFS):按照磁盘请求的先后顺序依次执行,即先执行先到达磁盘的请求,再执行后到达磁盘的请求。 2. 最短寻道时间优先算法(SSTF):选择当前磁头所在位置距离最近的磁道进行访问。 3. 扫描算法(SCAN):磁头沿着一个方向移动,直到到达磁盘的边缘,然后改变方向继续移动,直到访问完所有的磁道。 4. 循环扫描算法(CSCAN):类似于SCAN算法,但是磁头到达磁盘边缘后立即返回到磁盘的另一端,继续进行访问操作。 5. 最短时间优先算法(SJF):选择下一个最短时间的磁道进行访问。 为了比较这些算法的性能,可以通过模拟实现来进行测试。模拟实现的过程可以分为以下几个步骤: 1. 首先,需要生成一系列的磁盘请求,包括请求的磁道号和请求的时间戳。 2. 然后,使用不同的算法对这些请求进行调度,记录每个请求的响应时间和等待时间。 3. 最后,统计每种算法的平均响应时间和平均等待时间,并进行比较。 通过这种模拟实现的方式,可以得出每个算法的优缺点,并选择最适合的算法来提高系统的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值