编程之美----高效率地安排见面会----贪心策略

每一个面试是一个整数的闭区间【Bi,Ei】表示开始时间和结束时间,有N个面试要进行,求最少的面试点。

思路:按开始时间排序,使用贪心策略,每一个面试使用一个最小的正整数k来表示可行的颜色,当然如果重叠了就必须使用一个新的颜色。

c++实现:

 

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

struct meeting{

	int b,e;

}m[101];

bool cmp(meeting x,meeting y)//用于排序的谓词函数,这里没有抽象成为函数对象

							//而是简单使用函数指针 

{

	return x.b<y.b;

}

bool isoverlap(meeting &x,meeting &y)

{

	if(x.e<=y.b || x.b>=y.e)return 0;

	else return 1;

}

bool isforbidden[101];

int color[101];

int main()

{

	int n=4;

	m[0].b=1;m[0].e=5;m[1].b=2;m[1].e=3;m[2].b=3;m[2].e=4;m[3].b=3;m[3].e=6;

	sort(m,m+4,cmp);

	int nmaxcolor=0,k;

	for(int i=0;i<n;i++)

	{

		for(k=0;k<nmaxcolor;k++)

			isforbidden[k]=0;

		for(int j=0;j<i;j++)

			if(isoverlap(m[j],m[i]))isforbidden[color[j]]=1;

		for(k=0;k<nmaxcolor;k++)

			if(!isforbidden[k])break;

		if(k<nmaxcolor)color[i]=k;

		else color[i]=nmaxcolor++;			

	}

	cout<<nmaxcolor<<endl;

	return 0;

}  


 

 

你可能感兴趣的:(编程之美)