DS 단일 큐 큐 ---- 은행 멀티 윈도우 시뮬레이션

제목 설명

은행이 있다고 가정하면 K 윈도우 창 앞에 노란색 라인을 설정, 서비스를 제공, 도착 시간의 모든 고객은 노란 선은 긴 대기열에 배치 한 후. 윈도우가 유휴 상태 일 때, 공정 거래 창은 다음 고객입니다. 고객 가정 복수의 윈도우는 항상 때 대안 적으로, 낮은 번호의 윈도우를 선택한다.

이 질문의 서비스 요청 출력을 기다려야했다 마지막 시간을 완료, 평균 N 비트 고객의 대기 시간, 최대 대기 시간.

 

기입

입력 라인 (1)은 정수 양 제공 N ( ≤), 고객의 총 수를, 다음에 N 라인, 각 라인은 모든 고객의 도착 시간에 제공 T및 처리 시간이 P, 상기 입력 데이터가 도착하는 시간에 따라 이미 주문을 줄 것으로 가정 ; 마지막 줄은 양의 정수 준다 K를 ( ≤) 사업에 열 창문의 수.

 

수출

평균 대기 시간은 라인의 단부 사이의 공간으로 구분하여 출력 라인 (출력 소수점 장소), 최대 대기 시간, 마지막 완료 시간은, 여분의 공간이 없다.

 

샘플 입력

9 0 20 1 1 15 61 2 10 10 5 3 10 30 18 31 25 31 2 3

샘플 출력

6.2 17 62

신속한

사용법 #include <iostream> 
#INCLUDE <큐> 
#INCLUDE <iomanip>
 사용  공간을 성병;
INT queindex ( INT 총 큐 < INT > Q) 
{ 
    INT의 인덱스 = 0 ;  < INT > 온도 = Q;
    동안 (!의 temp.empty ()) 
    { 
        temp.pop (); 
        인덱스 ++ ; 
    } 
    리턴 총 색인 + 1 ; 
} 
  
int 형 ) (주 
{ 
    INT virclock = 0;
     더블 averagewait = 0 ;
     INT maxWait = 0 ;
     INT alreadytime = 0 ;  < INT > arrivetime; /// 로 고객의 시간 
    대기열 < INT > solvetime; /// 비즈니스 시간 할 
    INT의 T; 
    CIN >> T를;
     INT 시간 대기가 [T]는; /// 대기 시간을 각각의 고객은, 초기화는 0 
     ( INT I = 0 ; I <T; I ++ ) 
        시간 대기 [I] = 0 ;
      (INT 난 = 0 ; I <T는, I ++ ) 
    { 
        INT N, t는; 
        CIN >> N >> t; 
        (N) arrivetime.push; 
        solvetime.push (t); 
    } 
    INT K; 
    CIN >> K;  < INT > 뱅크 [K];
    값 int = 이루어 0 ;
    상태 (완료 == 0 ) 
    { 
        위해은 ( INT는 전 = 0 ; I <K는, 난 ++ ) 
        { 
            경우 (뱅크 [I] .empty ()) /// 银行有空位
            {
                 IF (! Arrivetime.empty () && arrivetime.front () <= virclock) /// 뱅크이었다 
                { 
                    뱅크 [I] .push (solvetime.front는 ()) 
                    (arrivetime.pop) 
                    solvetime.pop는 () ; 
                } 
            } 
        } 
        INT bankemp = 0 ; /// 은행 및 여러 공석, 공석 기다리는 사람들이있는 경우 판단이 0 인 경우 
        에 대한이 ( INT I = 0 ; 나는 <K, I ++ )
             만약에 (은행 [I] .empty ()) 
                bankemp ++ ;
         IF (bankemp == 0) 
        {  < INT > 임시 =이 arrivetime,
             그동안 (! Temp.empty () && temp.front () <= virclock) /// 그는 같은 사람이 몇 클라이언트, 배열 플러스 대기 시간이 찾을 수있는 첫 번째 경우 
            {
                 INT 번호를 = queindex (T, TEMP) 
                시간 대기 [수 - 1이다. ] + = 1이다. ] 
                temp.pop (); 
            } 
        } 
  
         ( INT I = 0 ; I <K; I ++) /// 미소 처리 
        {
             IF (! 은행 [I] .empty ()) 
            {
                INT 온도 = 뱅크 [I] .front () - 1 ; 
                뱅크 [I] .pop (); 
                뱅크 [I] .push (TEMP); 
                경우 (뱅크 [I] .front () == 0 ) 
                { 
                    뱅크 [I] .pop (); 
                } 
            } 
        } 
  
        INT EMP = 1 ; /// 判断是否完全结束
         ( INT 난 = 0 ; I <K 단계; I ++ ) 
        { 
            경우 (! 뱅크 [I] .empty ()) 
            { 
                EMP = 0 ;
                휴식 ;
            } 
        } 
        IF (EMP == 1. && arrivetime.empty () && solvetime.empty ()) 
            DONE = 1이다. ] 
  
        virclock ++; /// 다음에 분 
    }
      ( INT I = 0 ; I <T; I ++) / // 평균 대기 시간이 상기 최대 대기 시간을 계산 
    {
         IF (maxWait < 시간 대기 [I]) 
            maxWait = 시간 대기 [I] 
        averagewait + = 시간 대기 [I]을; 
    } 
    averagewait / = T; 
    alreadytime =virclock; 
    COUT << 고정 << setprecision ( 1 ) << averagewait << "  " ; 
    COUT << maxwait << "  " ; 
    COUT << alreadytime << ENDL;
    반환  0 ; 
}

추천

출처www.cnblogs.com/SZU-DS-wys/p/12180737.html