PTA 7 18 銀行排隊模擬(歸併排序的應用)

2021-10-04 16:38:42 字數 1586 閱讀 2961

這個題是歸併排序的乙個簡單應用,只需要掌握好歸併排序的思想,**很容易寫出。

設某銀行有a、b兩個業務視窗,且處理業務的速度不一樣,其中a視窗處理速度是b視窗的2倍 —— 即當a視窗每處理完2個顧客時,b視窗處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先後到達的時間間隔,並且當不同視窗同時處理完2個顧客時,a視窗顧客優先輸出。

輸入為一行正整數,其中第1個數字n(≤1000)為顧客總數,後面跟著n位顧客的編號。編號為奇數的顧客需要到a視窗辦理業務,為偶數的顧客則去b視窗。數字間以空格分隔。

按業務處理完成的順序輸出顧客的編號。數字間以空格分隔,但最後乙個編號後不能有多餘的空格。

8 2 1 3 9 4 11 13 15
1 3 2 9 11 4 13 15
對於本題,我們首先需要記錄每個顧客對應的結束時間,同時需要儲存使用者的id,我們使用乙個結構體來儲存。

struct person

linea[maxn]

, lineb[maxn]

;// 分別表示 a 隊伍的人和 b 隊伍的人

然後我們使用兩個全域性變數timea,timeb儲存兩個隊伍當前已經經過的時間

在輸入時就可以計算好所有人的結束時間後,使用歸併排序將兩隊結果輸出

完整**如下:

/*

author: veeupup

銀行業務佇列簡單模擬

a 的速度是 b 的兩倍,根據處理順序輸出

分別計算出 每個人結束的事件,歸併到一起

*/#include

#include

#include

#include

#define local

using

namespace std;

const

int maxn =

1010

;struct person

linea[maxn]

, lineb[maxn]

;int timea =

0, timeb =0;

// a 和 b 當前結束的時間

int numa =

0, numb =0;

intmain()

else

}// 開始歸併

int i =

0, j =0;

// i 代表 a 的編號,j 代表 b 的編號

bool flag =

false

;// 控制輸出格式

int nowtimea, nowtimeb, nowid;

while

(i < numa && j < numb)

else

if(flag)

else

}while

(i < numa)

else

}while

(j < numb)

else

}return0;

}

PTA 7 18 銀行業務佇列簡單模擬 25分

題目出處 設某銀行有a b兩個業務視窗,且處理業務的速度不一樣,其中a視窗處理速度是b視窗的2倍 即當a視窗每處理完2個顧客時,b視窗處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先後到達的時間間隔,並且當不同視窗同時處理完2個顧客時,a視窗顧客優先輸出。輸入...

休息 歸併排序 模擬

給出乙個數列,每次可以把乙個單調遞減的序列反過來,求最少要反多少次才能使這個序列單調遞增。in put inp ut 6 5 3 2 1 6 4ou tput o ut pu t3對於乙個數列,我們可以先按照題目所說的將單調遞減的數列取反。就變成這時候,每個曾經單調遞減的數列就單調遞增了,每個區間內...

休息 歸併排序 模擬

給出乙個數列,每次可以把乙個單調遞減的序列反過來,求最少要反多少次才能使這個序列單調遞增。in put role presentation inp utin put6 5 3 2 1 6 4ou tput role presentation out puto utpu t3對於乙個數列,我們可以先按...