题目
疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0..N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。
满足:
每当一个员工进入时,需要坐到最大社交距离的座位(例如:位置A与左右有员工落座的位置距离分别为2和2,位置B与左右有员工落座的位置距离分别为2和3,影响因素都为2个位置,则认为座位A和B与左右位置的社交距离是一样的);
如果有多个这样的座位,则坐到索引最小的那个座位。
满足:
每当一个员工进入时,需要坐到最大社交距离(最大化自己和其他人的距离的座位);
如果有多个这样的座位,则坐到 索引最小 的那个座位。
输入描述:
会议室座位总数 seatNum 。(1 <= seatNum <= 500)
员工的进出顺序 seatOrLeave 数组,元素值为 1,表示进场;元素值为负数,表示出场(特殊:位置 0 的员工不会离开)。
例如 - 4 表示坐在位置 4 的员工离开(保证有员工坐在该座位上)
输出描述:
最后进来员工,他会坐在第几个位置,如果位置已满,则输出 - 1 。
#include <stdio.h>
#include <map>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int ChooseSeat(int iSeatCount,vector<int> vecMemberList)
{
if (iSeatCount < 1 || iSeatCount > 500 ||vecMemberList.size() == 0)
{
return -1;
}
int* pSeatInfo = new int[iSeatCount];
memset(pSeatInfo,0x00,iSeatCount*4);
if (vecMemberList.size() == 1)
{
return 0;
}
if (vecMemberList.size() == 2)
{
return iSeatCount - 1;
}
*pSeatInfo = 1;
*(pSeatInfo+iSeatCount - 1) = 1;
for (size_t sCurSize = 2; sCurSize < vecMemberList.size();sCurSize++)
{
if (vecMemberList[sCurSize] == 1)
{
//新的员工入座
int* pSeatOper = pSeatInfo;
int iIndexLeft = 0;
int iIndexRight = 0;
int iMaxDistense = 0;
int iNewMemberIndex = 0;
for (int iCurPos = 0; iCurPos < iSeatCount;iCurPos++)
{
if (*(pSeatOper + iCurPos) == 0)
{
continue;
}
iIndexLeft = iIndexRight;
iIndexRight = iCurPos;
if ((iIndexRight - iIndexLeft) > 2)
{
//至少有一个空位
if(iIndexRight - iIndexLeft > iMaxDistense + 1)
{
iMaxDistense = iIndexRight - iIndexLeft;
iNewMemberIndex = iIndexLeft + iMaxDistense / 2;
}
}
}
if (iNewMemberIndex > 0 && iNewMemberIndex < iSeatCount)
{
*(pSeatOper + iNewMemberIndex) = 1;
cout << "new member seat here index:" << iNewMemberIndex << endl;
for (size_t sSizeOutPut = 0; sSizeOutPut < iSeatCount; sSizeOutPut++)
{
cout << *(pSeatInfo+ sSizeOutPut) <<" ";
}
cout << endl;
}
}
else if(vecMemberList[sCurSize] < 0)
{
size_t sPos = 0 - vecMemberList[sCurSize];
if (sPos >= 0 && sPos < vecMemberList.size())
{
*(pSeatInfo+sPos) = 0;
}
}
}
}
int main()
{
int arryMember[] = {1,1,1,1,-4,1,1,1,1,1,1,1,1,1,1,1,1};
vector<int> vecMemberList(arryMember,(arryMember+sizeof(arryMember)/sizeof(int)));
ChooseSeat(50,vecMemberList);
return 0;
}