贪心算法——活动安排、会场安排

重要参数:结构体,当前时间time,cmp比较器

第一题——活动安排:

任务描述

学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。

输入格式

第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动。
随后的n行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei)

输出格式

输出安排的最多的活动数

输入样例

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

输出样例

4

 

#include<stdio.h>
#include<algorithm> //sort头文件
using namespace std;  //sort使用命名空间

//结构体存储
struct S{
	int start;
	int end;
};


//结束时间最早有效
int cmp(S x,S y)
{
	return x.end<y.end;
}

int main()
{
	S a[10010];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&a[i].start,&a[i].end );
	}
	
	//结束时间由早到晚排序
	 sort(a,a+n,cmp);

	//开始时间点为0
	int time=0;
	//安排的会议数为0 
	int sum=0;
	
	//依次遍历每个活动,结束早的先安排 
	for(int i=0;i<n;i++)
	{
		if(time<=a[i].start)
		{
			sum++;
			time=a[i].end;
		}
	}
	
	printf("%d",sum);
	
	return 0;
}

 

第二题——会场安排:

任务描述

  假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)

输入格式

第一行有1 个正整数k,表示有k 个待安排的活动。接下来的k 行中,每行有2 个正整数,分别表示k 个待安排的活动开始时间和结束时间。时间以0 点开始的分钟计。

输出格式

将编程计算出的最少会场数

输入样例

5 1 23
12 28
25 35
27 80
36 50

输出样例

3

#include<stdio.h>
#include<algorithm>
using namespace std;

struct S{
	int start;
	int end;
	bool flag;  //标记当前活动是否安排过
};
//结束时间最早有效
int cmp(S x,S y)
{
	return x.end<y.end;
}
int main()
{
	S a[10010];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&a[i].start,&a[i].end );
		a[i].flag=0;
	}
	//结束时间由早到晚排序
	 sort(a,a+n,cmp);
	//开始时间点为0
	int time=0;
	//安排的房间数为0 
	int room=0;
    //初始未安排活动count
    //依次遍历每个活动
	int count=n;
	while(count>0)
	{
	for(int i=0;i<n;i++)
	{
        //如果当前活动未安排且和当前会场已有活动不冲突
		if(time<=a[i].start&&a[i].flag==0)  
		{
			time=a[i].end;
			a[i].flag=1;
			count--;
		}
	}
    //遍历一次,使用会场数加1,时间点重新开始
	room++;
    time=0;
	}
	printf("%d",room);
	return 0;
}

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值