PTA银行排队问题之单窗口“夹塞”版c++版——山东科技大学

题目:
排队“夹塞”是引起大家强烈不满的行为,但是这种现象时常存在。在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙。当窗口空闲时,下一位顾客即去该窗口处理事务。此时如果已知第i位顾客与排在后面的第j位顾客是好朋友,并且愿意替朋友办理事务的话,那么第i位顾客的事务处理时间就是自己的事务加朋友的事务所耗时间的总和。在这种情况下,顾客的等待时间就可能被影响。假设所有人到达银行时,若没有空窗口,都会请求排在最前面的朋友帮忙(包括正在窗口接受服务的朋友);当有不止一位朋友请求某位顾客帮忙时,该顾客会根据自己朋友请求的顺序来依次处理事务。试编写程序模拟这种现象,并计算顾客的平均等待时间。
输入格式:
输入的第一行是两个整数:1≤N≤10000,为顾客总数;0≤M≤100,为彼此不相交的朋友圈子个数。若M非0,则此后M行,每行先给出正整数2≤L≤100,代表该圈子里朋友的总数,随后给出该朋友圈里的L位朋友的名字。名字由3个大写英文字母组成,名字间用1个空格分隔。最后N行给出N位顾客的姓名、到达时间T和事务处理时间P(以分钟为单位),之间用1个空格分隔。简单起见,这里假设顾客信息是按照到达时间先后顺序给出的(有并列时间的按照给出顺序排队),并且假设每个事务最多占用窗口服务60分钟(如果超过则按60分钟计算)。
输出格式:
按顾客接受服务的顺序输出顾客名字,每个名字占1行。最后一行输出所有顾客的平均等待时间,保留到小数点后1位。
输入:

6 2
3 ANN BOB JOE
2 JIM ZOE
JIM 0 20
BOB 0 15
ANN 0 30
AMY 0 2
ZOE 1 61
JOE 3 10

输出:

JIM
ZOE
BOB
ANN
JOE
AMY
75.2

比较简单的一道题,话不多说,奉上代码

#include<bits/stdc++.h>
using namespace std;
struct people
{
    
    
    string name;
    int begintime;//开始时间
    int lasttime;//持续时间
    int time;//等待时间
} p[10001];
bool vis[10001];
int m,n;
int sum=0,ans=0;
int timer=0;
map<string,int>mp;
queue<people>okline;
void gocin()
{
    
    
    memset(vis,false,sizeof(vis));
    cin>>n>>m;
    int x,cnt;
    string name;
    for(int i=1; i<=m; i++)
    {
    
    
        cin>>x;
        for(int j=0; j<x; j++)
        {
    
    
            cin>>name;
            mp[name]=i;
        }
    }
    cnt=m+1;
    for(int i=0; i<n; i++)
    {
    
    
        cin>>p[i].name>>p[i].begintime>>p[i].lasttime;
        if(mp[p[i].name]==0)
            mp[p[i].name]=cnt++;
        if(p[i].lasttime>60)
            p[i].lasttime=60;
    }
}
void goans()
{
    
    
    for(int i=0; i<n; i++)
    {
    
    
        if(!vis[i])
        {
    
    
            vis[i]=true;
            if(timer<p[i].begintime)//来的时候前面没人
            {
    
    
                timer=p[i].begintime;
            }
            p[i].time=timer-p[i].begintime;
                timer+=p[i].lasttime;
            okline.push(p[i]);
            for(int j=i+1; j<n; j++)
            {
    
    
                if(!vis[j])
                {
    
    
                    if(mp[p[i].name]==mp[p[j].name])
                    {
    
    
                        if(p[j].begintime<=timer)
                        {
    
    
                            vis[j]=true;
                            p[j].time=timer-p[j].begintime;
                            timer+=p[j].lasttime;
                            okline.push(p[j]);
                        }
                        else
                            break;
                    }
                }
            }
        }
    }
}
void print()
{
    
    
    while(!okline.empty())
    {
    
    
        cout<<okline.front().name<<endl;
        ans+=okline.front().time;
        okline.pop();
    }
    printf("%.1f",1.0*ans/n);
}
int main()
{
    
    
    //freopen("in.txt","r",stdin);
    gocin();
    goans();
    print();
    return 0;
}

ps:代码仅供参考,请勿抄袭

猜你喜欢

转载自blog.csdn.net/scorpion_legend/article/details/109132163