问题 L: 深入浅出学算法054-活动选择

p.s.自用

题目描述

 学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使用。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。   

现在给出n个活动使用礼堂的起始时间begini和结束时间endi(begini < endi),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。

输入

先输入一个整数n 

接下来的n行,每行两个整数,第一个begini,第二个是endi(begini < endi    <=32767)

输出

输出最大的活动数

样例输入 Copy
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
样例输出 Copy
4
提示

n<1000

思路

要求最大活动数,则应使每个进行的活动尽早结束,且使下一个活动开始的时间最接近于上一个活动结束的时间。故排序时要从小到大排序,优先end。

参考答案
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
	// 输入
	int n;
	cin >> n;
	vector<int> begin(n, 0); // 起始时间
	vector<int> end(n, 0); // 结束时间
	for (int i = 0; i < n; i++)
		cin >> begin[i] >> end[i];

	// 求解
	// 冒泡排序:从小到大,1-end,2-begin
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (end[j] > end[j + 1] || (end[j] == end[j + 1] && begin[j] > begin[j + 1]))
			{
				int tempb = begin[j];
				begin[j] = begin[j + 1];
				begin[j + 1] = tempb;
				int tempe = end[j];
				end[j] = end[j + 1];
				end[j + 1] = tempe;
			}
		}
	}
	// 计数
	int res = 1;
	int end_now = end[0]; // 当前结束时间
	for (int i = 0; i < n; i++)
	{
		if (end_now <= begin[i])
		{
			res += 1;
			end_now = end[i];
		}
	}
	
	// 输出
	cout << res << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值