浙大PAT甲级 1026

来源:互联网 发布:kindle免费阅读软件 编辑:程序博客网 时间:2024/04/29 08:19

这个题目模拟队列,需要考虑的条件很多,在此列出:

(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];    }}


0 0
原创粉丝点击