会场问题,,,贪心算法,三个AC代码
-
问题描述
问题描述
题目来源:王晓东《算法设计与分析》
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小
会场数。)
输入格式:
第一行有 1 个正整数k,表示有 k个待安排的活动。
接下来的 k行中,每行有 2个正整数,分别表示 k个待安排的活动开始时间和结束时间。时间以 0 点开始的分钟计。
输出格式:
输出最少会场数。 -
问题分析
将会议开始时间和结束时间放在一起非降序排序,时间相等时,结束时间排在前面 -
AC代码
在这里插入代码片
#include <bits/stdc++.h>
using namespace std;
pair<int, int>beginn;
pair<int, int>endd;
vector<pair<int, int>>s;
int main()
{
int n;//总活动个数
cin >> n;
for (int i = 1; i <= n; i++)
{
int a, b;
cin >> a >> b;
beginn.first = a;
beginn.second = 1;
endd.first = b;
endd.second = 0;
s.push_back(pair<int, int>(a, 1));
s.push_back(pair<int, int>(b, 0));
}
//所有时间排一起,非递减排序,相同时间时,结束时间排前面
sort(s.begin(), s.end(), [](pair<int, int>a, pair<int, int>b) {return a.first == b.first ? a.second < b.second:a.first < b.first; });
int cnt = 0;
int maxx = 0;
for (auto i : s)
{ if (i.second)
{
++cnt;
maxx = maxx < cnt ? cnt : maxx;
}
else
{
--cnt;
maxx = maxx < cnt ? cnt : maxx;
}
}
cout << maxx;
return 0;
}
4、其他AC代码
两个AC代码