标签:start pos using operator win sse struct ons final
Suppose a bank has N windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. The rules for the customers to wait in line are:
Now given the processing time of each customer, you are supposed to tell the exact time at which a customer has his/her business done.
For example, suppose that a bank has 2 windows and each window may have 2 custmers waiting inside the yellow line. There are 5 customers waiting with transactions taking 1, 2, 6, 4 and 3 minutes, respectively. At 08:00 in the morning, customer1 is served at window1 while customer2 is served at window2. Customer3 will wait in front of window1 and customer4 will wait in front of window2. *Custome**r*5 will wait behind the yellow line.
At 08:01, customer1 is done and customer5 enters the line in front of window1 since that line seems shorter now. Customer2 will leave at 08:02, customer4 at 08:06, customer3 at 08:07, and finally *custome**r*5 at 08:10.
Each input file contains one test case. Each case starts with a line containing 4 positive integers: N (≤20, number of windows), M (≤10, the maximum capacity of each line inside the yellow line), K (≤1000, number of customers), and Q (≤1000, number of customer queries).
The next line contains K positive integers, which are the processing time of the K customers.
The last line contains Q positive integers, which represent the customers who are asking about the time they can have their transactions done. The customers are numbered from 1 to K.
For each of the Q customers, print in one line the time at which his/her transaction is finished, in the format HH:MM
where HH
is in [08, 17] and MM
is in [00, 59]. Note that since the bank is closed everyday after 17:00, for those customers who cannot be served before 17:00, you must output Sorry
instead.
2 2 7 5
1 2 6 4 3 534 2
3 4 5 6 7
08:07
08:06
08:10
17:00
Sorry
思路分析 先把前n*m个依此放进队列,每次优先队列弹出一个就再放一个即可
此题我犯了好多错误
1.优先队列取了一个节点居然忘记pop了,和de了老半天
2.审题错误,问的是开始时间在17:00之前的,不是服务结束后在17:00之前的,而且样例给了17:00也算,所以应该是
if(start_time[query]>=540)///审题
? {
? printf("Sorry\n");
? }
#include<bits/stdc++.h>
#define de(x) cout<<#x<<" "<<(x)<<endl
#define each(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
const int maxn=1000+5;
const int inf=0x3f3f3f3f;
struct node
{
int time,id;
node(int id=0,int time=0):id(id),time(time){}
friend bool operator<(node a,node b)
{
if(a.time==b.time)
return a.id>b.id;
else return a.time>b.time;
}
};
int wait_time[maxn];
int deadline[maxn];
int start_time[maxn];
int ans[maxn];
priority_queue<node>Q;
/*
2 2 7 7
1 2 6 4 3 534 2
1 2 3 4 5 6 7
*/
int main()
{
int n,m,k,q;
scanf("%d%d%d%d",&n,&m,&k,&q);
//de(k);
each(i,1,k)scanf("%d",&wait_time[i]);
//de(wait_time[1]);
int poi=1;
each(i,1,m)
{
each(j,1,n)
{
Q.push(node(j,deadline[j]+wait_time[poi]));
//de(poi);
start_time[poi]=deadline[j];
ans[poi]=deadline[j]+wait_time[poi];
//de(deadline[j]);
//de(wait_time[poi]);
//de(ans[poi]);
deadline[j]+=wait_time[poi];
poi++;
}
}
poi=m*n+1;
node temp;
while(poi<=k)
{
temp=Q.top();
Q.pop();//居然忘记了
int id=temp.id;
//de(poi);
//de(id);
//de(deadline[id]);
int time=temp.time;
//de(time);
start_time[poi]=deadline[id];
ans[poi]=deadline[id]+wait_time[poi];
Q.push(node(id,ans[poi]));
deadline[id]+=wait_time[poi];
poi++;
}
while(q--)
{
int query;
cin>>query;
//de(ans[query]);
//de(start_time[query]);
if(start_time[query]>=540)///审题
{
printf("Sorry\n");
}
else
printf("%02d:%02d\n",8+ans[query]/60,ans[query]%60);
}
return 0;
}
PAT-1014 Waiting in Line (30 分) 优先队列
标签:start pos using operator win sse struct ons final
原文地址:https://www.cnblogs.com/Tony100K/p/11758028.html