这题写了有一点时间,最开始想着优化一下时间,用优先队列去做,但是发现有锅,因为忽略了队的长度。

然后思考过后,觉得用时间线来模拟最好做,先把窗口前的队列填满,这样保证了队列的长度是统一的,这样的话如果到某个时间,队首的人已经服务完了,这样这个队列的长度就减少一,这就变成了所有队列中长度最短的队列,所以直接向这个队列里面添加一个人就可以了。

按照从小到大轮询窗口的话,这样正好符合题中的要求,就是队列长度相同短,先选窗口序号小的窗口。如果按照这种策略,少一个就补一个的策略,队列长度会一直保持相等。

#include <bits/stdc++.h>
using namespace std;
const int maxn=1010; int ans[maxn],a[maxn],N,M,K,Q,t[maxn];
queue<int> q[22];
int pret[22]; void print(int t)
{
if (t==-1) {
printf("Sorry\n");
return;
} t+=480;
int hh=t/60,mm=t%60;
// printf("%d %d ",hh,mm);
if (hh>17) {
printf("Sorry\n");
}
else {
printf("%02d:%02d\n",hh,mm);
}
} int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&N,&M,&K,&Q);
for (int i=1;i<=K;i++) {
scanf("%d",&t[i]);
}
for (int i=1;i<=Q;i++) {
scanf("%d",&a[i]);
}
int c=1;
for (int i=1;i<=M;i++) {
for (int j=1;j<=N;j++) {
q[j].push(c++);
if (c>K) {
break;
}
}
}
memset(ans,-1,sizeof(ans));
for (int i=0;i<=540;i++) {
if (c>K) break;
for (int j=1;j<=N;j++) {
int p=q[j].front();
int tt=t[p];
if (i-pret[j]==tt) {
ans[p]=i;
q[j].pop();
q[j].push(c++);
pret[j]=i;
if (c>K) {
goto outloop;
}
}
}
}
outloop:
for (int j=1;j<=N;j++) {
while (!q[j].empty()) {
if (pret[j]>=540) {
break;
}
int p=q[j].front();
ans[p]=pret[j]+t[p];
pret[j]+=t[p];
q[j].pop(); }
}
for (int i=1;i<=Q;i++) {
print(ans[a[i]]);
} return 0;
}

PAT 1014 Waiting in Line (30分) 一个简单的思路的更多相关文章

  1. PAT 甲级 1014 Waiting in Line (30 分)(queue的使用,模拟题,有个大坑)

    1014 Waiting in Line (30 分)   Suppose a bank has N windows open for service. There is a yellow line ...

  2. 1014 Waiting in Line (30分)

    1014 Waiting in Line (30分)   Suppose a bank has N windows open for service. There is a yellow line i ...

  3. 【PAT甲级】1014 Waiting in Line (30 分)(队列维护)

    题面: 输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数.输入K个正整数,分别代表每 ...

  4. PTA 1014 Waiting in Line (30分) 解题思路及满分代码

    题目 Suppose a bank has N windows open for service. There is a yellow line in front of the windows whi ...

  5. 1014 Waiting in Line (30 分)

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

  6. PAT 1014 Waiting in Line (模拟)

    1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  7. PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)

    1080 Graduate Admission (30 分)   It is said that in 2011, there are about 100 graduate schools ready ...

  8. PAT A 1014. Waiting in Line (30)【队列模拟】

    题目:https://www.patest.cn/contests/pat-a-practise/1014 思路: 直接模拟类的题. 线内的各个窗口各为一个队,线外的为一个,按时间模拟出队.入队. 注 ...

  9. 1014 Waiting in Line (30)(30 分)

    Suppose a bank has N windows open for service. There is a yellow line in front of the windows which ...

随机推荐

  1. Linux package installation: deb and rpm

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系): ...

  2. DTU DeepLearning: exercise 7

    torch activation functions: sigmoid, relu, tanh, softplus. https://morvanzhou.github.io/tutorials/ma ...

  3. 题解 P4289 【[HAOI2008]移动玩具】

    题目地址:https://www.luogu.com.cn/problem/P4289 题解原地址:https://createsj.blog.luogu.org/solution-p4289 让我们 ...

  4. Python之旅第四天(列表、元祖、字典和习题)

    第四天,感觉时间还是过得很快,今天内容确实有点多,关于list的方法实在是太多了,元组tuple感觉有点鸡肋,可能得到后面才知道他的作用吧,然后是字典,看了很多关于字典的介绍,但是这货到底是干啥用的一 ...

  5. Form表单利用Jquery Validate验证以及ajax提交

    #表单利用Jquery验证验证以及ajax提交 概述>详细讲解表单利用Jquery >验证验证以及ajax提交的过程,以及Validate的自定义提示语,非空判断,输入字段的远程ajax验 ...

  6. 【NOIP2001普及组】最大公约数和最小公倍数问题

    P1029 最大公约数和最小公倍数问题 最大公约数用辗转相除法: 最小公倍数:两个数的乘积=他们的最大公约数*最小公倍数,既然两个数的乘积及其最大公约数已知,那么最小公倍数也可以求了. #includ ...

  7. dict 字典合并

    实例 1 : 使用 update() 方法,第二个参数合并第一个参数 def Merge(dict1, dict2): return(dict2.update(dict1))   实例 2 : 使用 ...

  8. 题解【Codeforces438D】The Child and Sequence

    题目描述 At the children's day, the child came to Picks's house, and messed his house up. Picks was angr ...

  9. 【C语言】输入三个正整数a,b,c,求最大值,要求定义一个计算最大值的函数max(a,b),返回a,b的值

    #include<stdio.h> int max(int a, int b)/*定义函数*/ { if (a > b) return a; else return b; } int ...

  10. Redis 配置文件杂项。

    protected-mode -----------------保护模式 redis3.2版本后新增protected-mode配置,默认是yes,即开启.设置外部网络连接redis服务,设置方式如下 ...