您的位置:首页 > 编程语言

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

2013-07-07 20:37 246 查看
每一个面试是一个整数的闭区间【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: