PAT甲级1014 测试点4、5

1014 Waiting in Line (30分)

直接模拟整个过程就好啦,没啥弯弯绕绕的;

  • 测试点4、5:顾客只要是在17:00前开始服务的都可以被服务完,所以判断条件里还要加上这一条;及代码中注释部分
#include
using namespace std;
struct man{
    int id,ServTime;
    int ETime;  
};

int main(){
	int n,m,k,q; 
	cin>>n>>m>>k>>q;
	vector<man> men(k);
	vector<queue<man>> line(n);
	queue<man> wait;
	for(int i=0;i<k;i++){
		cin>>men[i].ServTime;
		men[i].id=i;
		if(i<n) men[i].ETime=men[i].ServTime;
		if(i<n*m) line[i%n].push(men[i]);
		else wait.push(men[i]);
	}

	int nowtime=0,cnt=0;
	while(nowtime<9*60 && cnt<k){
		nowtime++;
		for(int i=0;i<n;i++){
			if(line[i].empty())continue;
			man nowman=line[i].front();
			if(nowman.ETime==nowtime){
				line[i].pop();
				line[i].front().ETime=nowtime+line[i].front().ServTime;
				men[nowman.id].ETime=nowman.ETime;
				if(!wait.empty()){
					line[i].push(wait.front());
					wait.pop();
				}
				cnt++;
			}
			//这里这里~~~
			else if(nowman.ETime>9*60){
				men[nowman.id].ETime=nowman.ETime;
				cnt++;
			}
		}
	}
	
	int idx;
	for(int i=0;i<q;i++){
		cin>>idx;
		if(men[idx-1].ETime==0)cout<<"Sorry"<<endl;
		else
			printf("%02d:%02d\n",men[idx-1].ETime/60+8,men[idx-1].ETime%60);
	}
	return 0;
}

你可能感兴趣的:(PAT甲级刷题历程)