A1014 Waiting in Line (30 分)

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int inf = (1 << 31) - 10;
const int maxn = 1010;
struct Win{
	int acc, now;
	queue<int> q;
}win[50];
int N, M, K, Q;
int pro[maxn], down[maxn], start[maxn]; 
int L = 8 * 3600, R = 17 * 3600;
int main(){	
	scanf("%d %d %d %d", &N, &M, &K, &Q);
	for(int i = 1; i <= K; i++){
		scanf("%d", &pro[i]);
		pro[i] *= 60;
	}
	for(int i = 1; i <= N; i++){
		start[i] = L;
		win[i].acc = L + pro[i];	 
		down[i] = win[i].acc; 
		win[i].now = pro[i];
		win[i].q.push(pro[i]);
	}		
	for(int i = N+1; i <= K; i++){
		int minlen = inf, idx = 0, minNow = inf;				
		for(int j = 1; j <= N; j++){	
			if(minlen > win[j].q.size()){
				minlen = win[j].q.size();
				idx = j;
			}
			minNow = min(minNow, win[j].now);			
		}
		if(minlen == M){
			int flag = 0;
			for(int j = 1; j <= N; j++){
				if(win[j].now > minNow){
					win[j].now -= minNow;
				}else{
					win[j].q.pop();
					win[j].now = win[j].q.front();		
					if(flag == 0){
						start[i] = win[j].acc;
						win[j].acc += pro[i];
						down[i] = win[j].acc;	
						win[j].q.push(pro[i]);
						flag = 1;
					}	
				}
			}
		}else{
			start[i] = win[idx].acc;
			win[idx].acc += pro[i];
			down[i] = win[idx].acc;
			win[idx].q.push(pro[i]);
		}	
	}	
	int x, hh, mm;
	for(int i = 0; i < Q; i++){
		scanf("%d", &x);
		if(start[x] < R){
			hh = down[x] / 3600;
			mm = (down[x] % 3600) / 60;
			printf("%02d:%02d\n", hh, mm);
		}else{
			printf("Sorry\n");
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值