PAT 1014 Waiting in Line

1: 全错,

修改下句增加queryCnt<q 的判断:

while(queryCnt < q && cusSeq <= k){//need query   &&  customer is crossing the yellow line


2:对了2个case(k < n*m的情况),得7分;

修改判断“Sorry”的条件:

//if(curEndTime <= 540){		//end transaction before 17:00
if(lastEndTime <= 540){			//start transaction before 17:00


3:又对了1个case, 得10分;

再修改判断"Sorry"条件:

if(lastEndTime < 540){                //start transaction before 17:00


4:又一个,14分;


5: 终于发现,题目要query的customer不一定会按照递增顺序给出,所以需要在模拟过程中把所有的customer 的结束time存下来,再按照query的次序依次打出,AC了,耗了了我快6个小时

PAT上不支持中文注释
 

import java.util.Scanner;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
 

public class Main{
	
	public static void main(String [] args) throws Exception{ 
		
//		Scanner in = new Scanner(new File("./in.txt")); 	//for local test
		Scanner in = new Scanner(System.in);				//for online judge
		
		
		int n, m , k, q;//window num, capacity, customer num, query num
		List<Integer> proTime = new ArrayList<Integer>();
		List<Integer> query = new ArrayList<Integer>();
		
		
		n = in.nextInt();
		m = in.nextInt();
		k = in.nextInt();
		q = in.nextInt();
		
		int i;
		for(i = 0; i < k; i++){
			int tmp = in.nextInt();			
			proTime.add(tmp);
		}
		
		for(i = 0; i < q; i++){
			int tmp = in.nextInt();
			query.add(tmp);
		}
 
		
		List<LinkedList<Integer>> cusQue = new ArrayList<LinkedList<Integer>>();//simulate the queue using linkedlist
		 				//one queue for each Window, storing the done time of each customer in the queue
						//add customer beyond the yellow line one by one
						//the customer beyond the yellow line join the queue with the smallest queue head(earliest done time)
						//so find the queue with smallest queue head, take out it and output it if query it
						
						
		
		
		for(i = 0; i < n; i++){// window : 0,1,2,...,n-1
			cusQue.add(new LinkedList<Integer>());
		}
		
		
		int cusSeq = 1;//customer 1,2,....,k

		String [] strRes = new String[k+1];//end time for customer 1,2,...,k
		
 
		while( cusSeq <= k){//in yellow line there are n*m customers
			
			StringBuilder res = new StringBuilder();
			
			int winSeq = 0 ;//which window should the customer wait at, winSeq: 0,1,2,...,n-1
			
			if(cusSeq <= n*m){//first n*m customers no need to judge
			 
				winSeq = (cusSeq - 1)%n;//cusSeq mapping to window number: 0,1,2,...,n-1
			}else{

				int j, earliestPos = 0, earliestTime = cusQue.get(0).peek();//find the smallest head of each window queue
				 
				for(j = 0 ; j < n; j++ ){
					int leaveTime = cusQue.get(j).peek();
					if(leaveTime < earliestTime){
						earliestPos = j;
						earliestTime = leaveTime;
					}
				}
				winSeq = earliestPos;

			}

			
			LinkedList<Integer> toAddLs = cusQue.get(winSeq);
			
			int lastEndTime = 0;
			if(toAddLs.size() > 0){
				lastEndTime = toAddLs.getLast();//the tail time 
			}
			
			int curEndTime = lastEndTime + proTime.get(cusSeq - 1);
			
			toAddLs.add(curEndTime); //add the done time of current customer
			
			if(cusSeq > n*m){//after n*m customers
				toAddLs.poll();//remove the head after inserting 
			}
			

			if(lastEndTime < 540){			//start transaction before 17:00
					int hour = 8 + curEndTime/60;
					int min = curEndTime%60;
					
					String strTime = String.format("%02d", hour)+":"+String.format("%02d", min);// the fucking format 
					
					res.append(strTime);
			}else{
					res.append("Sorry");
			}
				
			strRes[cusSeq] = res.toString();

			cusSeq++;
		}
		
		StringBuilder sb = new StringBuilder();
		for(int seq:query){						//the sequence in query may not be increasing order !!!!
			sb.append(strRes[seq]+"\n");
		}

		sb.deleteCharAt(sb.length()-1);//remove the last "\n"
		System.out.println(sb.toString());
 	
	}
 	 
}


你可能感兴趣的:(PAT_JAVA)