PAT甲级1014

这波出了点小问题,有个段错误没找出来,说是递归调用过多或者堆栈数组溢出,但感觉都不是,找了好半天。代码写的很简洁,就懒得重写了。 。
在这里插入图片描述

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector<int>window_list[25];
int N,M,K,Q;
int timme[1010];
int fin_time[1010];
int main() {
	cin>>N>>M>>K>>Q;
	int i,j;
	for(i=0; i<K; i++)
		cin>>timme[i+1];
	int empty=N*M;
	for(i=0; i<K&&empty; i++) {
		window_list[i%N+1].push_back(i+1);
		empty--;
	}
	int times=0;
	while(times<9*60-1) {
		times++;
		for(j=1; j<=N; j++) {
			if(--timme[window_list[j][0]]==0) {
				fin_time[window_list[j][0]]=times;
				window_list[j].erase(window_list[j].begin());
				if(i+1<=K)
					window_list[j].push_back(++i);
			}
		}
	}
	for(j=1;j<=N;j++){
		if(window_list[j].size())
			fin_time[window_list[j][0]]=times+timme[window_list[j][0]];
	} 
	for(j=0; j<Q; j++) {
		cin>>i;
		if(fin_time[i]!=0)
			printf("%02d:%02d\n",(8+fin_time[i]/60)%24,fin_time[i]%60);
		else
			printf("%s\n","Sorry");
	}
	return 0;
}

后续:
上网仔细研究了段错误的产生原因,经过排查,是因为window_list可能存在空列的情况,这个时候访问它的第一个顾客就会产生段错误。
修改后代码:

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector<int>window_list[25];
int N,M,K,Q;
int timme[1010];
int fin_time[1010];
int main() {
	cin>>N>>M>>K>>Q;
	int i,j;
	for(i=0; i<K; i++)
		cin>>timme[i+1];
	int empty=N*M;
	for(i=0; i<K&&empty; i++) {
		window_list[i%N+1].push_back(i+1);
		empty--;
	}
	int times=0;
	while(times<9*60-1) {
		times++;
		for(j=1; j<=N; j++) {
			if(window_list[j].size()&&--timme[window_list[j][0]]==0) {
				fin_time[window_list[j][0]]=times;
				window_list[j].erase(window_list[j].begin());
				if(i+1<=K)
					window_list[j].push_back(++i);
			}
		}
	}
	for(j=1;j<=N;j++){
		if(window_list[j].size())
			fin_time[window_list[j][0]]=times+timme[window_list[j][0]];
	} 
	for(j=0; j<Q; j++) {
		cin>>i;
		if(fin_time[i]!=0)
			printf("%02d:%02d\n",(8+fin_time[i]/60)%24,fin_time[i]%60);
		else
			printf("%s\n","Sorry");
	}
	return 0;
}

在这里插入图片描述

发布了26 篇原创文章 · 获赞 1 · 访问量 800

猜你喜欢

转载自blog.csdn.net/qq_43654994/article/details/105351185
今日推荐