PAT甲1026 Table Tennis (30)

心态爆炸……
注意点:
1. 客户超出两小时要限制为两小时;
2. 有可能出现21点后到店的客户;
3. vip客户到店后会优先选择VIP桌,不论此时是否有普通桌空着。


#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map> 
#include <vector>
#include <queue>
using namespace std;

const int inf=10000000;

struct table
{
    int id;
    bool vip;
    int endtime;
    int servenum;
    int occupy;
    table()
    {
        endtime=0;
        servenum;
        occupy=0;
    }
}t[110];

struct player
{
    int arrivetime;
    int servetime;
    int starttime;
    int endtime;
    bool vip;
    bool play;
    player()
    {
        play=false;
        starttime=50000;
    }
}c[10010];

queue<int> waitline;
queue<int> vipline;
queue<int> total;

int N,K,M,close=13*3600;
int opentable;

bool cmpc(player a,player b)
{
    return a.arrivetime<b.arrivetime;
}

bool cmpt2(table a,table b)
{
    if(a.occupy!=b.occupy)return a.occupy>b.occupy;
    if(a.occupy==0)return a.id<b.id;
    if(a.occupy==1)return a.endtime<b.endtime;
    else return a.id<b.id;
}

bool cmpr(player a, player b)
{
    return a.starttime<b.starttime;
}

bool cmptr(table a,table b)
{
    return a.id<b.id;
}

int num=0,vipi=-1;
int nextvip(int now)
{
    while(now<N)
    {
        now++;
        if(c[now].vip==true)
        break;
    }
    return now;
}

void fenpei(int tid,int pid)
{
    t[tid].endtime=max(t[tid].endtime,c[pid].arrivetime)+min(7200,c[pid].servetime);
    c[pid].endtime=t[tid].endtime;
    c[pid].starttime=c[pid].endtime-min(7200,c[pid].servetime);
    if(c[pid].starttime<close)
    {
        t[tid].servenum++;
    }
}

int main()
{
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        int h,m,s;
        scanf("%d:%d:%d",&h,&m,&s);
        int temp=h*3600+m*60+s;
        temp=temp-8*3600;
        c[i].arrivetime=temp;

        scanf("%d%d",&temp,&c[i].vip);
        c[i].servetime=temp*60;
    }
    sort(c,c+N,cmpc);
    for(int i=0;i<N;i++)
    {
        total.push(i);
    }
    scanf("%d%d",&K,&M);
    opentable=K;
    for(int i=0;i<K;i++)
    {
        t[i].id=i;
    }
    for(int i=0;i<M;i++)
    {
        int index;
        scanf("%d",&index);
        t[index-1].vip=true;
    }

    int index=0;
    int clock=0;
    vipi=nextvip(vipi);
    while(num<N)
    {
        int tid=-1,MinEnd=inf;
        for(int i=0;i<K;i++)
        {
            if(t[i].endtime<MinEnd)
            {
                MinEnd=t[i].endtime;
                tid=i;
            }
        }
        if(t[tid].endtime>=close)break;
        if(c[num].vip==true&&vipi>num)
        {
            num++;
            continue;
        }
        if(t[tid].vip==true)
        {
            if(c[num].vip==true)
            {
                fenpei(tid,num);
                if(vipi==num)vipi=nextvip(vipi);
                num++;
            }
            else
            {
                if(vipi<N&&c[vipi].arrivetime<=t[tid].endtime)
                {
                    fenpei(tid,vipi);
                    vipi=nextvip(vipi);
                }
                else
                {
                    fenpei(tid,num);
                    num++;
                }
            }
        }
        else
        {
            if(c[num].vip==false)
            {
                fenpei(tid,num);
                num++;
            }
            else
            {
                int viptid=-1,minservetime=inf;
                for(int i=0;i<K;i++)
                {
                    if(t[i].vip==true&&t[i].endtime<minservetime)
                    {
                        minservetime=t[i].endtime;
                        viptid=i;
                    }
                }
                if(viptid!=-1&&t[viptid].endtime<=c[num].arrivetime)
                {
                    fenpei(viptid,num);
                    if(vipi==num)vipi=nextvip(vipi);
                    num++;
                }
                else
                {
                    fenpei(tid,num);
                    if(vipi==num)vipi=nextvip(vipi);
                    num++;
                }
            }
        }
    }
    sort(c,c+N,cmpr);
    for(int i=0;i<N;i++)
    {
        if(c[i].starttime<close)
        {
            double wait=c[i].starttime-c[i].arrivetime;
            int h,m,s;
            h=c[i].arrivetime/3600;
            m=(c[i].arrivetime-3600*h)/60;
            s=c[i].arrivetime%60;
            printf("%02d:%02d:%02d",h+8,m,s);
            printf(" ");
            h=c[i].starttime/3600;
            m=(c[i].starttime-3600*h)/60;
            s=c[i].starttime%60;
            printf("%02d:%02d:%02d",h+8,m,s);
            printf(" ");
            int waitt=(wait+30)*1.0/60;
            printf("%d\n",waitt);
        }
    }
    sort(t,t+K,cmptr);
    for(int i=0;i<K;i++)
    {
        printf("%d",t[i].servenum);
        if(i!=K-1)printf(" ");
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhy489275918/article/details/80459500