PAT 1017. Queueing at Bank
来源:互联网 发布:红帽linux是什么 编辑:程序博客网 时间:2024/05/01 21:54
【题目链接】
这道题比1014要简单,但是最后一个case始终过不了,暂时记载在这篇博文上。思路和1014差不多,只不过这题所有的人都站在了黄线外等待,只有窗口空闲才去该窗口获取服务。需要注意的有以下几点:
1、客户只要在17点01分之前到达,就一定有窗口对此客户服务到底,也就是说他开始接受服务的时间可以在17点01分及之后的时间。
2、当有窗口空闲,但是下一位顾客还未到来时,窗口需要等待。
3、若全部顾客在17点之后到达,则输出“0.0”。
代码如下:
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int n, k;int leaveTime[10005];int waitTime[10005];int window[105]; //存放对应窗口当前服务的客户编号struct Customer{ int arriveTime; int processTime;}buf[10005];bool cmp(Customer a, Customer b){ return a.arriveTime < b.arriveTime;}int main(){ //freopen("in_1017.txt", "r", stdin); int hour, minute, second; cin >> n >> k; for(int i = 0; i < n; i++) { cin >> hour; getchar(); cin >> minute; getchar(); cin >> second >> buf[i].processTime; buf[i].processTime *= 60; buf[i].arriveTime = hour * 3600 + minute * 60 + second; } sort(buf, buf + n, cmp); int cus; int num = 0; //在17点之后到达的顾客数量 for(int i = 0; i < k && i < n; i++) { cus = i; window[i] = i; if(buf[i].arriveTime < 8 * 3600) { leaveTime[i] = 8 * 3600 + buf[i].processTime; waitTime[i] = 8 * 3600 - buf[i].arriveTime; } else if(buf[i].arriveTime <= 17 * 3600) { leaveTime[i] = buf[i].arriveTime + buf[i].processTime; waitTime[i] = 0; } else { waitTime[i] = -1; num++; continue; } } int min_leave; //最早的离开时间 int min_win; //每次离开的客户对应的窗口序号 for(int i = cus + 1; i < n; i++) { if(buf[i].arriveTime > 17 * 3600) { waitTime[i] = -1; num++; continue; } min_leave = 18 * 3600 + 1; for(int j = 0; j < k; j++) { int u = window[j]; //u保存当前窗口服务的客户编号 if(leaveTime[u] < min_leave) { min_leave = leaveTime[u]; cus = u; min_win = j; } } window[min_win] = i; //当有窗口空闲, 但是下一位顾客还未到来时, 窗口需要等待; if(leaveTime[cus] < buf[i].arriveTime) leaveTime[cus] = buf[i].arriveTime; waitTime[i] = leaveTime[cus] - buf[i].arriveTime; leaveTime[i] = leaveTime[cus] + buf[i].processTime; } double average = 0; for(int i = 0; i < n; i++) if(waitTime[i] >= 0) average += waitTime[i]; else break; if(n != num) //若全部顾客在17点之后到达,下面语句分母为0 printf("%.1lf\n", average / 60 / (n - num)); else printf("0.0\n");}
0 0
- PAT 1017. Queueing at Bank
- PAT 1017. Queueing at Bank
- PAT 1017. Queueing at Bank
- 【PAT】1017. Queueing at Bank
- pat 1017. Queueing at Bank (25)
- pat 1017. Queueing at Bank (25)
- 【PAT】1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- PAT A 1017.Queueing at Bank (25)
- PAT (Advanced) 1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- 【PAT】1017. Queueing at Bank (25)
- PAT 1017. Queueing at Bank (25)
- PAT-甲级-1017. Queueing at Bank【模拟】
- 【PAT甲级】1017. Queueing at Bank (25)
- 第十三周阅读项目(6):链表类 .
- 唐山哪个治自闭症
- c# 设置窗体初始化为居中显示
- 关于手机号正则表达式
- android4.0+ 以上如何用通用方法打开日历
- PAT 1017. Queueing at Bank
- 第12周-程序阅读-多态性与抽象类-纯虚函数
- android 获取网络图片
- oralce初始化
- 唐山哪个yiyuan看小孩自闭症好
- java基础整理のstatic关键字
- Linux Tools Intro - CMake build and install
- IOS开发中的几种设计模式介绍
- leetcode 188---Best Time to Buy and Sell Stock IV