PAT甲级-1017 Queueing at Bank

题目

题目大意

银行有k个窗口,每个窗口只能服务1个人。如果3个窗口已满,就需要等待。给出n个人到达银行的时间和服务时间,要求计算每个人的平均等待时间。如果某个人的到达时间超过17:00:00,则不被服务,等待时间也不计算在内。如果某个人早于8:00:00到达,那该人要至少等到8:00:00才能被服务。

思路

银行排队问题,根据题意模拟,和1014相似。首先考虑怎么处理字符串形式的时间,这里我将小时,分钟,秒都计算出来,到达时间用秒来表示。一个人有到达时间,服务时间,还要计算等待时间,因此我用结构体来表示,数据结构就用了一个结构体数组。因为要考虑先后顺序,所以肯定要排序。

排序之后先考虑一般情况,一个人的等待时间 = 窗口的最小结束服务时间 - 到达时间(只有前面的某个窗口结束服务,这个人才能开始服务)。再考虑这个人的到达时间晚于窗口结束服务时间的情况,也就是说,他到银行的时候就已经有空位了。那么他的等待时间 = 0,结束服务时间 = 到达时间 + 服务时间。因此需要一个window数组来记录每个窗口的结束服务时间,也就是可以开始服务下一个人的时间。window数组初始化为8点,也即每个窗口开始服务下一个人的时间是8点。

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

struct man{
    int begin;  // 开始时间(单位:秒)
    int time;  // 服务时间(单位:秒)
    int wait;  // 等待时间(单位:秒)
};

bool cmp(man x, man y){
    return x.begin < y.begin;
}

int main(){
    int n, k;
    cin >> n >> k;
    vector<man> v;
    vector<int> window(k, 8 * 3600);  // 记录每个窗口服务结束的时间
    for (int i = 0; i < n; i++){
        string s0;
        int begin, time, wait = 0;
        cin >> s0 >> time;
        if (s0 <= "17:00:00"){
            int h = (s0[0] - '0') * 10 + (s0[1] - '0');
            int m = (s0[3] - '0') * 10 + (s0[4] - '0');
            int s = (s0[6] - '0') * 10 + (s0[7] - '0');
            begin = h * 3600 + m * 60 + s;
            v.push_back({begin, time * 60, wait});
        }
    }

    sort(v.begin(), v.end(), cmp);
    for (int i = 0; i < (int)v.size(); i++){
        int mini = 0, mint = INT_MAX;
        for (int j = 0; j < k; j++){
            if (mint > window[j]){
                mint = window[j];
                mini = j;
            }
        }  // 最小结束时间
        v[i].wait = max(0, window[mini] - v[i].begin);  // 考虑顾客到达时间在结束时间之后
        window[mini] = max(window[mini], v[i].begin) + v[i].time;  // 考虑顾客到达时间在结束时间之后
    }
    double res = 0.0;
    for (int i = 0; i < (int)v.size(); i++){
        res += v[i].wait;
    }
    res /= (int)v.size() * 60.0;
    printf("%.1lf\n", res);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957816.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

文章目录 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑一 参考二 安装三 启动准备大模型文件 四 数据集&#xff08;关键&#xff09;&#xff01;4.1 Alapaca格式4.2 sharegpt4.3 在 dataset_info.json 中注册4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分…

AI刷题-策略大师:小I与小W的数字猜谜挑战

问题描述 有 1, 2,..., n &#xff0c;n 个数字&#xff0c;其中有且仅有一个数字是中奖的&#xff0c;这个数字是等概率随机生成的。 Alice 和 Bob 进行一个游戏&#xff1a; 两人轮流猜一个 1 到 n 的数字&#xff0c;Alice 先猜。 每完成一次猜测&#xff0c;主持会大声…

【数据分享】1929-2024年全球站点的逐年最低气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…

Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…

【JavaSE】(8) String 类

一、String 类常用方法 1、构造方法 常用的这4种构造方法&#xff1a;直接法&#xff0c;或者传参字符串字面量、字符数组、字节数组。 在 JDK1.8 中&#xff0c;String 类的字符串实际存储在 char 数组中&#xff1a; String 类也重写了 toString 方法&#xff0c;所以可以直…

JS(6)-数组

一.数组的基本使用 1.数组&#xff1a;把多个数据存到一组 每个数组都有编号&#xff0c;从零开始&#xff0c;数组的编号叫索引或下标&#xff0c;可以存放数字&#xff0c;字符串等。 2.取值 3.遍历数组&#xff1a;用循环的方法把每个数都访问到 a)练习 首先&#xff0c;定…

查看电脑或笔记本CPU的核心数方法及CPU详细信息

一、通过任务管理器查看 1.打开任务管理器 可以按下“Ctrl Shift Esc”组合键&#xff0c;或者按下“Ctrl Alt Delete”组合键后选择“任务管理器”来打开。 2.查看CPU信息 在任务管理器界面中&#xff0c;点击“性能”标签页&#xff0c;找到CPU使用记录区域&#xff0c…

Docker核心命令与Yocto项目的高效应用

随着软件开发逐渐向分布式和容器化方向演进&#xff0c;Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程&#xff0c;大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具&#xff0c;与 Docker 的结合进一步增强了开发…

08-Elasticsearch

黑马商城作为一个电商项目&#xff0c;商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 首先&#xff0c;查询效率较低。 由于数据库模糊查询不走索引&#xff0c;在数据量较大的时候&#xff0c;查询性能很…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

Scratch全攻略:从入门到实践的编程之旅

目录 一、Scratch 基础入门1.1 Scratch 是什么1.2 安装与界面熟悉1.2.1 在线版1.2.2 离线版1.2.2.1 舞台区1.2.2.2 角色区1.2.2.3 脚本区1.2.2.4 背景区1.2.2.5 声音区 二、核心编程要素2.1 角色与舞台2.2 积木块详解2.2.1 运动类积木2.2.2 外观类积木2.2.3 声音类积木2.2.4 事…

STM32之CubeMX新建工程操作(十八)

STM32F407 系列文章 - STM32CubeMX&#xff08;十八&#xff09; 目录 前言 一、STM32CubeMX 二、新建工程 ​编辑 1.创建工程 2.选择芯片型号 3.Pinout引脚分配 1.SYS配置 2.RCC配置 3.定时器配置 4.GPIO引脚配置 5.中断配置 6.通讯接口配置 7.插件Middleware配…

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…

GenTact Toolbox:为Franka Research 3机械臂定制触觉 “皮肤” 的创新方案

前言&#xff1a; 在机器人的发展历程中&#xff0c;为其配备全身触觉皮肤一直是一项充满挑战的任务。传统的触觉皮肤设计往往采用模块化、“一刀切” 的方式&#xff0c;虽然具备一定通用性&#xff0c;但无法充分考虑机器人独特的形状以及其操作环境的特殊需求。在复杂的现实…

设计模式Python版 单例模式

文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模…

JVM面试题解,垃圾回收之“对象存活判断”剖析

一、JVM怎么判断一个类/对象是不是垃圾&#xff1f; 先来说如何判断一个对象是不是垃圾 最常用的就是引用计数法和可达性分析 引用计数法 引用计数法为每个对象维护一个计数器来跟踪有多少个引用指向该对象。每当创建一个新的引用指向某个对象时&#xff0c;计数器加1&…

【Django开发】django美多商城项目完整开发4.0第14篇:Docker使用,1. 在Ubuntu中安装Docker【附

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…