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