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

编程之美:第一章 1.9高效率地安排见面会

2018年05月18日 ⁄ 综合 ⁄ 共 1368字 ⁄ 字号 评论关闭
/*
每一个面试是一个整数的闭区间[B[i],E[i]],表示开始时间和结束时间,有N个面试要进行,求最少的面试点

思路:
按开始时间排序,使用贪心策略,每一个面试用一个最小的正整数k来表示可行的颜色,当然如果重叠了就必须使用
一个新的颜色
输入:
4(N场见面会,接下来有N行,每一行表示节目的开始时间和结束时间)
1 5
2 3
3 4
3 6
输出:
3
*/

#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>

using namespace std;

const int MAXSIZE = 1000;

typedef struct Meeting
{
 bool operator < (const Meeting& meet) const
 {
  return _iBeg < meet._iBeg;
 }
 int _iBeg;
 int _iEnd;
}Meeting;
//Meeting meet[MAXSIZE];

bool isOverlap(const Meeting& meet1,const Meeting& meet2)
{
 if(meet1._iEnd <= meet2._iBeg || meet1._iBeg >= meet2._iEnd)//判断两个区间不重叠,只需一个区间的结束<=另一个区间的开始,或者一个区间的开始>=另一个区间的结束
 {
  return false;
 }
 else
 {
  return true;
 }
}

int minAddress(Meeting* pMeet,int iLen)
{
 int maxcolor = 0,k;
 int color[MAXSIZE];
 bool bForbidden[MAXSIZE];//bForbidden是每个时间区间i,其他时间区间j中开始时间位于这个时间之前的
 //且与这个时间区间有重叠的面试所占用的颜色表示数组
 memset(bForbidden,0,sizeof(bForbidden));//没整明白
 for(int i = 0 ; i < iLen; i++)
 {
  for(k = 0 ; k < maxcolor ; k++)
  {
   bForbidden[k] = false;
  }
  for(int j = 0 ; j < i ; j++)
  {
   if(isOverlap(pMeet[j],pMeet[i]))//判断在时间区间i之前的其他时间区间是否与当前时间区间重叠
   {
    bForbidden[color[j]] = true;
   }
  }
  for(k = 0 ; k < maxcolor ; k++)
  {
   if(!bForbidden[k])
   {
    break;
   }
  }
  if(k < maxcolor)
  {
   color[i] = k;
  }
  else
  {
   color[i] = maxcolor++;
  }
 }
 return maxcolor;
}

void process()
{
 int n;
 while(EOF != scanf("%d",&n))
 {
  if(n < 0 )
  {
   break;
  }
  Meeting meet[MAXSIZE];
  for(int i = 0 ; i < n ; i++)
  {
   scanf("%d %d",&meet[i]._iBeg,&meet[i]._iEnd);
  }
  sort(meet,meet+n);
  printf("%d\n",minAddress(meet,n));
 }
}

int main(int argc,char* argv[])
{
 process();
 getchar();
 return 0;
}

 

抱歉!评论已关闭.