这个题目模拟队列,需要考虑的条件很多,在此列出:
(1)vip的顾客优先考虑vip桌子,如果没有空vip桌子则考虑普通桌。
(2)普通客户也可以占vip桌子,当有多个桌子空则选择编号最小的桌。
(3)客户占用桌子时间不能超过2小时,超过则按2小时计算。
(4)如果在21点之前没有能够占到桌子,则不予考虑。
(5)注意等待时间四舍五入。
AC代码:
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
int id;
int arr_xiaoshi;
int arr_fen;
int arr_miao;
int vip;
int deal_time;
int ser_xiaoshi=8;
int ser_fen=0;
int ser_miao=0;
int fin_xiaoshi;
int fin_fen;
int fin_miao;
};
int vip[105];
int num[105];
bool cmp(node x,node y)
{
if(x.arr_xiaoshi!=y.arr_xiaoshi)
return x.arr_xiaoshi<y.arr_xiaoshi;
else
{
if(x.arr_fen!=y.arr_fen)
return x.arr_fen<y.arr_fen;
else
{
return x.arr_miao<y.arr_miao;
}
}
}
bool cmp1(node x,node y)
{
if(x.fin_xiaoshi!=y.fin_xiaoshi)
return x.fin_xiaoshi<y.fin_xiaoshi;
else
{
if(x.fin_fen!=y.fin_fen)
return x.fin_fen<y.fin_fen;
else
{
if(x.fin_miao!=y.fin_miao)
return x.fin_miao<y.fin_miao;
else
return x.id<y.id;
}
}
}
bool cmp2(node x,node y)
{
if(x.fin_xiaoshi!=y.fin_xiaoshi)
return x.fin_xiaoshi<y.fin_xiaoshi;
else
{
if(x.fin_fen!=y.fin_fen)
return x.fin_fen<y.fin_fen;
else
{
if(x.fin_miao!=y.fin_miao)
{
return x.fin_miao<y.fin_miao;
}
else
{
if(x.vip!=y.vip)
return x.vip>y.vip;
else
return x.id<y.id;
}
}
}
}
bool cmp3(node x,node y)
{
if(x.ser_xiaoshi!=y.ser_xiaoshi)
return x.ser_xiaoshi<y.ser_xiaoshi;
else
{
if(x.ser_fen!=y.ser_fen)
return x.ser_fen<y.ser_fen;
else
{
//if(x.ser_miao!=y.ser_miao)
return x.ser_miao<y.ser_miao;
/* else
return x.vip>y.vip;*/
}
}
}
bool f(node x,node y)
{
if(x.arr_xiaoshi<y.arr_xiaoshi)
return true;
else if(x.arr_xiaoshi>y.arr_xiaoshi)
return false;
else
{
if(x.arr_fen<y.arr_fen)
return true;
else if(x.arr_fen>y.arr_fen)
return false;
else
{
if(x.arr_miao<y.arr_miao)
return true;
else
return false;
}
}
}
bool ff(node x,node y)
{
if(x.arr_xiaoshi<y.fin_xiaoshi)
return true;
else if(x.arr_xiaoshi>y.fin_xiaoshi)
return false;
else
{
if(x.arr_fen<y.fin_fen)
return true;
else if(x.arr_fen>y.fin_fen)
return false;
else
{
if(x.arr_miao<y.fin_miao)
return true;
else
return false;
}
}
}
void cal_fin(node &x)
{
if(x.deal_time>=120)
{
x.fin_xiaoshi=x.ser_xiaoshi+2;
x.fin_fen=x.ser_fen;
x.fin_miao=x.ser_miao;
}
else
{
x.fin_fen=(x.ser_fen+x.deal_time)%60;
x.fin_xiaoshi=x.ser_xiaoshi+(x.ser_fen+x.deal_time)/60;
x.fin_miao=x.ser_miao;
}
}
int main()
{
int n;
cin>>n;
vector<node> ord;
vector<node> vipp;
map<int,vector<node> > m_ord;
map<int,vector<node> > m_vip;
vector<node> all;
for(int i=0;i<n;i++)
{
node tmp;
scanf("%d:%d:%d",&tmp.arr_xiaoshi,&tmp.arr_fen,&tmp.arr_miao);
cin>>tmp.deal_time>>tmp.vip;
if(tmp.vip==1)
vipp.push_back(tmp);
else
ord.push_back(tmp);
}
int k,m;
cin>>k>>m;
for(int i=0;i<m;i++)
{
int d;
cin>>d;
vip[d]=1;
vector<node> v;
m_vip.insert(pair<int,vector<node> >(d,v));
}
for(int i=1;i<=k;i++)
{
if(vip[i]==0)
{
vector<node> v;
m_ord.insert(pair<int,vector<node> >(i,v));
}
}
sort(ord.begin(),ord.end(),cmp);
sort(vipp.begin(),vipp.end(),cmp);
int it1=ord.size();
int it2=vipp.size();
int ll=0,rr=0;
while(ll!=it1||rr!=it2)
{
node tmp;
if(ll>=it1&&rr<it2)
{
tmp=vipp[rr];
}
else if(ll<it1&&rr>=it2)
{
tmp=ord[ll];
}
else if(ll<it1&&rr<it2)
{
tmp=f(ord[ll],vipp[rr])==true?ord[ll]:vipp[rr];
}
else if(ll>=it1&&rr>=it2)
{
break;
}
map<int,vector<node> >::iterator itt;
for(itt=m_ord.begin();itt!=m_ord.end();itt++)
{
if(itt->second.empty())
continue;
if(ff(tmp,itt->second.front())==false)
{
itt->second.erase(itt->second.begin());
}
}
for(itt=m_vip.begin();itt!=m_vip.end();itt++)
{
if(itt->second.empty())
continue;
if(ff(tmp,itt->second.front())==false)
{
itt->second.erase(itt->second.begin());
}
}
if(tmp.vip==0) //最早到是普通客户
{
map<int,vector<node> >::iterator it;
int flag=0;
for(int i=1;i<=k;i++)
{
if(vip[i]==1)
{
if(m_vip[i].empty())
{
tmp.id=i;
if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600)
{tmp.ser_xiaoshi=tmp.arr_xiaoshi;
tmp.ser_fen=tmp.arr_fen;
tmp.ser_miao=tmp.arr_miao;}
cal_fin(tmp);
num[i]++;
m_vip[i].push_back(tmp);
flag=1;
ll++;
break;
}
}
else
{
if(m_ord[i].empty())
{
tmp.id=i;
if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600)
{tmp.ser_xiaoshi=tmp.arr_xiaoshi;
tmp.ser_fen=tmp.arr_fen;
tmp.ser_miao=tmp.arr_miao;}
cal_fin(tmp);
num[i]++;
m_ord[i].push_back(tmp);
flag=1;
ll++;
break;
}
}
}
if(flag==0)
{
node tt[105];
int shu=0;
for(it=m_ord.begin();it!=m_ord.end();it++)
{
tt[shu++]=it->second.front();
}
for(it=m_vip.begin();it!=m_vip.end();it++)
{
tt[shu++]=it->second.front();
}
sort(tt,tt+shu,cmp1);
node tmp1=tt[0];
int haoma=tmp1.id;
if(vip[haoma]==0)
{
m_ord[haoma].erase(m_ord[haoma].begin());
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
tmp.id=haoma;
cal_fin(tmp);
m_ord[haoma].push_back(tmp);
num[haoma]++;
ll++;
}
else
{
m_vip[haoma].erase(m_vip[haoma].begin());
if(tmp.vip==0)
{
if(rr<it2)
{
if(ff(vipp[rr],tmp1))
{
tmp=vipp[rr];
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
rr++;
}
else
{
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
ll++;
}
cal_fin(tmp);
tmp.id=haoma;
m_vip[haoma].push_back(tmp);
num[haoma]++;
}
else
{
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
cal_fin(tmp);
tmp.id=haoma;
cal_fin(tmp);
m_vip[haoma].push_back(tmp);
num[haoma]++;
ll++;
}
}
else
{
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
cal_fin(tmp);
tmp.id=haoma;
cal_fin(tmp);
m_vip[haoma].push_back(tmp);
num[haoma]++;
rr++;
}
}
}
}
else //最早到是vip客户
{
map<int,vector<node> >::iterator it;
int flag=0;
for(it=m_vip.begin();it!=m_vip.end();it++)
{
if(it->second.empty())
{ if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600)
{tmp.ser_xiaoshi=tmp.arr_xiaoshi;
tmp.ser_fen=tmp.arr_fen;
tmp.ser_miao=tmp.arr_miao;}
tmp.id=it->first;
cal_fin(tmp);
m_vip[tmp.id].push_back(tmp);
num[tmp.id]++;
flag=1;
rr++;
break;
}
}
if(flag==0)
{
for(it=m_ord.begin();it!=m_ord.end();it++)
{
if(it->second.empty())
{
if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600)
{tmp.ser_xiaoshi=tmp.arr_xiaoshi;
tmp.ser_fen=tmp.arr_fen;
tmp.ser_miao=tmp.arr_miao;}
tmp.id=it->first;
cal_fin(tmp);
m_ord[tmp.id].push_back(tmp);
num[tmp.id]++;
flag=1;
rr++;
break;
}
}
}
if(flag==0)
{
node tt[105];
int shu=0;
for(it=m_vip.begin();it!=m_vip.end();it++)
{
tt[shu++]=it->second.front();
//cout<<tt[shu-1].fin_xiaoshi<<" "<<tt[shu-1].fin_fen<<" "<<tt[shu-1].fin_miao<<endl;
}
for(it=m_ord.begin();it!=m_ord.end();it++)
{
tt[shu++]=it->second.front();
//cout<<tt[shu-1].fin_xiaoshi<<" "<<tt[shu-1].fin_fen<<" "<<tt[shu-1].fin_miao<<endl;
}
sort(tt,tt+shu,cmp2);
node tmp1=tt[0];
//cout<<tmp1.id<<endl;
int haoma=tmp1.id;
tmp.ser_xiaoshi=tmp1.fin_xiaoshi;
tmp.ser_fen=tmp1.fin_fen;
tmp.ser_miao=tmp1.fin_miao;
tmp.id=haoma;
num[haoma]++;
rr++;
cal_fin(tmp);
if(vip[haoma]==1)
{
m_vip[haoma].erase(m_vip[haoma].begin());
m_vip[haoma].push_back(tmp);
}
else
{
m_ord[haoma].erase(m_ord[haoma].begin());
m_ord[haoma].push_back(tmp);
}
}
}
all.push_back(tmp);
}
sort(all.begin(),all.end(),cmp3);
for(int i=0;i<all.size();i++)
{
if(all[i].ser_xiaoshi>=21)
{
num[all[i].id]--;
continue;
}
else
{
printf("%02d:%02d:%02d ",all[i].arr_xiaoshi,all[i].arr_fen,all[i].arr_miao);
printf("%02d:%02d:%02d ",all[i].ser_xiaoshi,all[i].ser_fen,all[i].ser_miao);
int time1=all[i].ser_xiaoshi*3600+all[i].ser_fen*60+all[i].ser_miao;
int time2=all[i].arr_xiaoshi*3600+all[i].arr_fen*60+all[i].arr_miao;
double ww=((time1-time2)*1.0+30)/60;
printf("%d\n",(int)(ww));
}
}
cout<<num[1];
for(int i=2;i<=k;i++)
{
cout<<" "<<num[i];
}
}