1014 Waiting in Line (30分)测试点分析

本题就是一个模拟题,较复杂,理清思路还是问题不大。
不过这个题目有点坑的地方,比如如果一个顾客正在被服务,但是银行下班了,那么应该继续为该顾客服务,直到顾客完成需求。

如果不考虑这一点,测试点2,4,5都无法通过。

这个题目肯定需要用到队列,不过本人擅长vector,于是始终用vector的操作代替queue。
附上本人代码

#include
#include
using namespace std;
vector<int>arr[20];
int main() {
     
	int N, M, K, Q, t = 1, count = 0;
	scanf("%d%d%d%d", &N, &M, &K, &Q);
	vector<int>V(K + 1),ans(K+1),Query(Q),line;
	int time[21];
	fill(time, time + 21, 480);
	for (int i = 1; i <= K; i++) {
     		//输入的同时给 不需要排队的顾客放入队列
		scanf("%d", &V[i]);
		if (i <= N * M)arr[t].push_back(i);
		else line.push_back(i);
		t++;
		if (t > N)t -= N;		//循环,重新开始
	}
	for (int i = 0; i < Q; i++)scanf("%d", &Query[i]);	//输入每个顾客的时间
	while (count++ < K) {
     
		int min = 999999, index;
		for (int i = 1; i <= N; i++) {
     
			if (arr[i].size() == 0||time[i]>=1020)continue;//如果开始时间大于下班时间,忽略该窗口
			if (time[i]+V[arr[i][0]] < min) {
     			//寻找最早完成时间
				min = time[i] + V[arr[i][0]];
				index = i;
			}
		}
		if (min == 999999)break;	//如果没有需要处理的 窗口,结束程序。
		int mumber = arr[index][0];
		time[index]= ans[mumber] = min;
		arr[index].erase(arr[index].begin());
		if (line.size() != 0) {
     
			arr[index].push_back(line[0]);
			line.erase(line.begin());
		}
	}
	for (int i = 0; i < Query.size(); i++) {
     
		if (ans[Query[i]] == 0)printf("Sorry\n");
		else printf("%02d:%02d\n", ans[Query[i]] / 60, ans[Query[i]] % 60);
	}
	return 0;
}

你可能感兴趣的:(PAT甲级,PAT刷题日志)