PAT (Advanced Level) Practice - 1017 Queueing at Bank(25 分)

题目链接:点击打开链接

 

题目大意:有 N 个人,K 个服务窗口,按时间顺序进行排序,计算等待时间(开始时间 - 达到时间) + 业务时间。主循环用客户数量,与之前那题(1014)用时间控制为主循环不太一样。
Ps1:题目确保不会有相同时间达到的情况。
Ps2:题目所求客户平均等候时间,而不是平均在银行的时间。

 

解题思路:做这一类“银行排队”题目的问题一般处理步骤如下:

  • 1、找主循环变量控制大局
  • 2、初始化数据读入
  • 3、初始化队伍
  • 4、主循环
  • 5、扫尾

 

AC 代码

#include
#include

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int maxn=10005;
const int EI=8*3600;
const int SEDONE=17*3600+1;

struct peo
{
    int ss,cos,ed,wait;
    friend bool operator<(peo p1,peo p2)
    {
        return p1.ed>p2.ed; // 小->大
    }
}peos[maxn];

priority_queue pq;

int cmp(peo p1,peo p2)
{
    return p1.ssp.ss?EI-p.ss:0;
            peos[l].ed=p.cos*60+peos[l].wait+p.ss;
            pq.push(peos[l]);
        }

        int rs=0;
        while(l=SEDONE) break;
            p=pq.top(); pq.pop();
            rs+=p.wait;

            peos[l].wait=p.ed>peos[l].ss?p.ed-peos[l].ss:0;
            peos[l].ed=peos[l].cos*60+peos[l].wait+peos[l].ss;
            pq.push(peos[l]);
            l++;
        }

        while(!pq.empty())
        {
            p=pq.top(); pq.pop();
            rs+=p.wait;
        }

        printf("%.1f\n",rs*1.0/60/l);
    }

    return 0;
}

 

你可能感兴趣的:(#,ACM,#,PTA,#,STL,#,模拟题集)