Tmk吃汤饭
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 414 Solved: 173
Submit Status Web Board
Description
Tmk喜欢吃汤饭!
Tmk喜欢吃汤饭!!
Tmk喜欢吃汤饭!!!
汤饭窗口分点餐和取餐两个窗口,一位蜀黍负责点餐窗口,一位蜀黍负责煮汤,一位蜀黍负责打饭,点餐需要1个单位时间,每一份需要煮5个单位时间,同一时间最多可以煮4份。
现在tmk要考考你,给你所有人的到达时刻,每个人在到达时刻排到点餐队列的末尾,点完餐后排到取餐队列,煮好后即可取餐,问你最后一个人取到汤饭的时间。
除了点餐和煮汤的时间,其他时间忽略不计,没人插队,而且他们意志坚定,所以不会中途而废,每个汤饭必须连续煮,不能中断。
Input
第一行一个T(0<T<=100),表示有多少组数据。
对于每组数据:
第一行一个整数n(0<=n<=100000)表示有n个人。
第二行,n个整数,以空格隔开(其中t[i]>=0 && t[i] < 50000000 && t[i] > t[i-1]),t[i]表示第i个人的到达时刻。
Output
对于每个样例,输出最后一个人取到汤饭的时间。
Sample Input
2
3
4 5 6
5
2 3 4 5 6
Sample Output
12
13
HINT
Source
思路:模拟题,只是有点绕。。
其实在模拟的时候觉得可以用队列来做,但是我还是在听了别人的建议才真正开始用队列。
#include<stdio.h>
#include<functional>
#include<vector>
#include<queue>
#include<math.h>
#include<cstring>
#include<algorithm>
#include<iostream>
#define INF 9999999
using namespace std;
struct node
{
int start;//最后真正存每个人的饭开始做的时间
}a[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
queue<node>q;
node b;
int n,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].start);//每个人来到的时间
a[i].start=a[i].start+1;//
}
int s=1;
for(i=1; i<=n;i++)
{
//这里分两种情况
if(q.size()<4)//前面不足4人的情况,点餐之后可以立即煮饭
{
q.push(a[i]);
b=q.front();
s=a[i].start;//此时存的时间是队列中最后一个人的开始煮饭时间
}
else//队列已经排满,也就是正在煮面的有4人以上,
{
b=q.front();
q.pop();
s=b.start+5;//需要等,那我就把当前队列的第一个人煮饭完毕的时间算出来,
if(s<a[i].start)//再与当前需要进队的开始煮饭时间相比,如果当前需要进队的人的开始煮饭时间比较靠后,就将s置为当前需要进队的人的开始煮饭时间,否则这步不操作
{
s=a[i].start;
}
q.push(a[i]);//将当前需进队的人进队
}
}
printf("%d\n",s+5);//最后一个人还有5分钟的煮饭时间
}
return 0;
}