浙大PAT甲级 1026

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

(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值