1014 Waiting in Line

#include
using namespace std;
int n,m,k,q;
typedef struct ss {
	int h,m,t;
} ss;
ss a[1004];
int b[1004],N;
vector< vector<int> > Q(20);
void del(int i) {//客户完成办理计算时间,并在办理数组中删除当前客户
	a[Q[i][0]].m+=N+a[Q[i][0]].t;
	a[Q[i][0]].h+=a[Q[i][0]].m/60;
	a[Q[i][0]].m%=60;
	Q[i].erase(Q[i].begin());
}
void Del(int M) {
	N+=a[Q[M][0]].t;
	for(int j=0; j<n; j++)
		if(j-M&&Q[j].size())
			a[Q[j][0]].t-=a[Q[M][0]].t;//为其他窗口的客户减掉当前结束客户的时间
	a[Q[M][0]].t=0;
	if(N>=540)//判断当前最快结束的客户结束时是否超过限制时间
		for(int j=0; j<n; j++)
			if(j-M&&Q[j].size()) 
				del(j);
	del(M);
}
void late() {//未能在限制时间内开始办理的客户一律按照超时计算
	for(int i=0; i<n; i++)
		for(int j=0; j<Q[i].size(); j++)
			a[Q[i][j]].h=18;
}
int main() {
	scanf("%d %d %d %d",&n,&m,&k,&q);
	m;
	int p=0;
	N=0;
	for(int i=1; i<=k; i++) {
		scanf("%d",&a[i].t);
		if(N<540) {
			a[i].m=0;
			a[i].h=8;
			int M=-1;
			if(Q[p].size()==m) {//当Q数组长度达到m时开始判断和删除Q数组最早结束的客户,并在该客户的数组中添加下一个客户数据
				for(int j=0; j<n; j++)
					if(M<0||a[Q[M][0]].t>a[Q[j][0]].t)
						M=j;
				Del(M);
				p=M;
			}
			Q[p++].push_back(i);
			p%=n;
			if(N>=540)
				late();
		} else
			a[i].h=18;
	}
	int T;
	while(N<540) {
		T=1;
		int M=-1;
		for(int j=0; j<n; j++)
			if(Q[j].size()&&(M<0||a[Q[M][0]].t>a[Q[j][0]].t)) {
				M=j;
				T=0;
			}
		if(T)
			break;
		Del(M);
		if(N>=540)
			late();
	}
	for(int i=0; i<q; i++) {
		int x;
		cin>>x;
		if(a[x].h<=17)
			printf("%02d:%02d\n",a[x].h,a[x].m);
		else
			printf("Sorry\n");
	}
	return 0;
}

你可能感兴趣的:(PAT,(Advanced,Level),Practice,c语言,c++)