现在的位置: 首页 > 综合 > 正文

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

2014年01月21日 ⁄ 综合 ⁄ 共 791字 ⁄ 字号 评论关闭

每一个面试是一个整数的闭区间【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;
}  

抱歉!评论已关闭.