1014 Waiting in Line (30分)解题思路

2024-01-01 09:38
文章标签 waiting 30 解题 思路 line 1014

本文主要是介绍1014 Waiting in Line (30分)解题思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1014 Waiting in Line (30分)解题思路

原题链接

这题我觉得有点难度,细节上的东西不少,最重要的思想是要设定一个统一的时间轴timeLine

思路

设置N个队列(每个窗口都对应一个队列),队列长度最大为M,初始化的时候将每个人的编号填入所有的队列,如果填满了N*M,就停止填充,剩下的编号作为排队线以外的顾客编号。填充方法如下图
在这里插入图片描述
另外,开辟一个数组cost_time[]cost_time[i]表示顾客i办理业务的耗时

然后开启循环,在所有队列的首部中找出耗时最少的顾客的编号,假设下图中的黑色圆圈中的编号2顾客的cost_time[2]是编号1,2,3,4中耗时最少的,则把1,2,3,4的耗时都减去cost_time[2],即
cost_time[i] = cost_time[i] - cost_time[2] (i=1, 2, 3, 4)
在这里插入图片描述

与此同时,时间轴往后推进,timeLine = timeLime + cost_time[2]

如果减完后cost_time[i] = 0,则说明顾客i已经办完业务了,记录下i的结束时间为此时的time_line

然后更新队列,将队列首部中cost_time为0的顾客编号pop掉,将排队线以外的新顾客添加到队尾。

重复上述操作直至队列为空。

AC代码

#include <iostream>
#include <queue>
using namespace std;queue<int>queue_[21];
int cost_time[1002];        //每个人办理业务的耗时
int cost_time_backup[1002]; //cost_time的备份数组。后面要用
int inquiryID[1002];//询问者的ID
int N, M, K, Q;     //N: 总窗口数     M:  队列长度    K:  客户数      Q:  询问数
int count_;         //队列中填充过的人数
int timeLine;       //时间线,这是统一的时间轴
int leave_time_table[1002];//完成办理的时刻
//找出所有队列的队列首元素中
int findSmallestCost(){int min = 999999;int index=-1;for(int i=1; i<=N; i++){if(queue_[i].size() == 0){continue;}else if(cost_time[queue_[i].front()] < min){min = cost_time[queue_[i].front()];index = queue_[i].front();}}return index;//如果返回-1说明所有的队列已经空了
}
//更新队列
void update(){for(int i=1; i<=N; i++){if(queue_[i].size()>0 && cost_time[queue_[i].front()] == 0){queue_[i].pop();if(count_ <= K)//如果填充的数量还小于K,则在此队列中填充一个人queue_[i].push(count_++);}}
}    
void showTime(){int ID;int hour, minute;int time;for(int i=1; i<=Q; i++){ID = inquiryID[i];time = leave_time_table[ID];hour = time / 60 + 8;minute = time % 60;if(time - cost_time_backup[ID] >= 540)printf("Sorry\n");elseprintf("%02d:%02d\n", hour, minute);}
}
int main(){count_ = 1;cin>>N>>M>>K>>Q;for (int i=1; i<=K; i++){cin>>cost_time[i];cost_time_backup[i] = cost_time[i];}for(int i=1; i<=Q; i++){cin>>inquiryID[i];}int flag = 0;int i=1,j=1;//首次填充队列for(i=1; i<=M; i++){for(j=1; j<=N; j++){if(count_ > K){//如果填充的数量等于了K,则停止填充flag = 1;break;}queue_[j].push(count_);count_++;}if(flag == 1)break;}int index;int dec;for(;;){index = findSmallestCost();if(index == -1)break;dec = cost_time[index];timeLine += dec;//cout << timeLine << endl;for(int i=1; i<=N; i++){if(queue_[i].size() > 0){cost_time[queue_[i].front()] -= dec;if(cost_time[queue_[i].front()] == 0){leave_time_table[queue_[i].front()] = timeLine;}}}update();}showTime();return 0;
}

这篇关于1014 Waiting in Line (30分)解题思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558849

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4