PAT 1014__部分正确

参考了:

http://blog.csdn.net/huajh7/article/details/7918144

有一个4分case过不了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
using namespace std;//没有这句queue没法使用

int main(){
	//freopen("in.txt","r",stdin);

	int N,M,K,Q;
	
	queue<int> q[20];
	int finTime[1000+20];//finTime[1000+N]

	int procTime[1000];
	int i;
	int pos = 0;

	scanf("%d %d %d %d",&N,&M,&K,&Q);
	for(i=0;i<K;i++){
		scanf("%d",&procTime[i]);
	}

	for(i=0;i<K;i++){
		finTime[i] = 0;
	}

	int window;
	while(pos<N*M && pos<K){
		int window = pos%N;
		q[window].push(pos);		
		
		
		finTime[pos] = finTime[pos] + procTime[pos];
		finTime[pos + N] = finTime[pos];//下一个位置的base time

		pos++;
	}
	
	int j=0;
	while(pos<K){
		
		//当前第一行N个办理业务的顾客谁最先办完,就排谁所在的队
		int temp = N-1;

		//test		
		//for(i=0; i<N; i++){
		//		printf("q[%d] front = %d\n",i,q[i].front());
		//}

		for(i=0; i<N; i++){
			if(	q[i].size()==0	){	temp = i; break;}//优先选则空队
			else if( q[i].size()>0 && (finTime[q[i].front()]	<	finTime[temp])){
				temp = i;//进黄线后站哪个队
			}
		}

		//test
		//printf("temp=%d\n",temp);

		//当前排的队的队尾
		int previousCust = q[temp].back();

		q[temp].pop();//办完一个
		q[temp].push(pos);//一个从黄线外进队列里

		finTime[pos] = finTime[ previousCust ] + procTime[pos];

		//test
		//printf(" finTime[%d]=%d\n",pos, finTime[pos]);
		//printf("\n");

		pos++;
	}

	////test
	//for(i=0;i<K;i++){
	//	printf("customer[%d]=%d\n",i,finTime[i]);
	//}

	for(i=0;i<Q;i++){
		int qq;
		scanf("%d",&qq);
		int fin =  finTime[qq-1];
		//17::00(含)之前被服务就行,不要求在17:00前服务结束
		if( (finTime[qq-1] - procTime[qq-1])>=540){
			printf("Sorry\n");
		}else{
			int hour = 8 + fin/60;
			int min =fin%60;
			printf("%02d:%02d\n",hour,min);
		}

	}

	return 0;
}


你可能感兴趣的:(PAT 1014__部分正确)