1 需求分析
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.设计一个有效的贪心算法进行安排.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相连顶点着不同颜色的最少着色数,相应于要找最少会场数.)
2 概要设计
主函数
贪心算法
3 详细设计
首先定义一个结构体数组,用来存储每个活动的开始时间和结束时间
struct node
{
int x, y; //x为活动开始时间,y为活动结束时间
}P[MAX];
然后设计一个排序算法,按升序排列活动结束时间
bool cmp(node a, node b)
{
return a.y < b.y; //使a.y<b.y
}
sort(P, P + n, cmp); //按升序排列活动结束时间
然后通过for循环录入活动开始时间活动结束时间
for (int i = 0; i < n; ++ i)
{
scanf("%d%d", &a,&b);
P[i].x = a; //活动开始时间
P[i].y = b; //活动结束时间
}
贪心算法
for (int i = 0; i < n; ++ i)
{
if (P[i].x > temp) //若活动开始时间大于活动结束时间则把下一个活动结束时间赋给temp,并增加会场数
{
temp = P[i].y;
++ ans;
}
}
4复杂度分析
sort(P, P + n, cmp)排序,时间复杂度为log2n
贪心算法:时间复杂度为nlog n
排序时冒泡排序时间复杂度为O(n2)
经百度后sort排序时间复杂度为log2n故采用sort排序
5测试
4 测试
活动数:5
开始 结束
12 15
18 27
26 55
1 8
2 9
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e6 + 10;
int a, b, ans = 1, temp, n;
struct node
{
int x, y;
} P[MAX];
bool cmp(node a, node b)
{
return a.y < b.y;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; ++ i)
{
scanf("%d %d", &a,&b);
P[i].x = a,
P[i].y = b;
}
sort(P, P + n, cmp);
temp = P[0].y;
for (int i = 0; i < n; ++ i)
{
if (P[i].x > temp)
{
temp = P[i].y;
++ ans;
}
}
printf("%d\n", ans);
return 0;
}