PTA 7-12 银行排队问题之单窗口“夹塞”版 (30 分)

PTA 7-12 银行排队问题之单窗口“夹塞”版 (30 分)

#include <iostream>
#include <cstdio>
#include <queue>
#include<map>
#include<algorithm>
using namespace std;
struct customer
{
    string name;
    int arrive;
    int service;
    int wait;
    int friendship;
    bool vis;
};
int main()
{
    int n,m,l,c=1,ST=0;
    double sumwaittime=0;
    map<string,int> fri;
    string name;
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        cin>>l;
        for(int j=0;j<l;j++)
        {
            cin>>name;
            fri[name]=c;
        }
        c++;
    }
    customer cus[n];
    for(int i=0;i<n;i++)
    {
        cin>>cus[i].name>>cus[i].arrive>>cus[i].service;
        if(cus[i].service>60)
        {
            cus[i].service=60;
        }
        cus[i].friendship=fri[cus[i].name];
        cus[i].vis=false;
    }
    for(int i=0;i<n;i++)
    {
        if(cus[i].friendship==0&&cus[i].vis==false)
        {
            cus[i].wait=max(ST-cus[i].arrive,0);
            ST=max(ST+cus[i].service,cus[i].arrive+cus[i].service);
            sumwaittime+=cus[i].wait;
            cus[i].vis=true;
            cout<<cus[i].name<<endl;
//            cout<<cus[i].wait<<endl;
        }
        else if(cus[i].vis==false)
        {
            cus[i].wait=max(ST-cus[i].arrive,0);
            ST=max(ST+cus[i].service,cus[i].arrive+cus[i].service);
            sumwaittime+=cus[i].wait;
            cus[i].vis=true;
            cout<<cus[i].name<<endl;
//            cout<<cus[i].wait<<endl;
            for(int j=i+1;j<n;j++)
            {
                if(cus[j].friendship==cus[i].friendship&&cus[j].vis==false&&cus[j].arrive<=ST)
                {
                    cus[j].wait=max(ST-cus[j].arrive,0);
                    ST=max(ST+cus[j].service,cus[j].arrive+cus[j].service);
                    sumwaittime+=cus[j].wait;
                    cus[j].vis=true;
                    cout<<cus[j].name<<endl;
//                    cout<<cus[i].wait<<endl;
                }
            }
        }
    }
    printf("%.1f",sumwaittime/n);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值