這個題是歸併排序的乙個簡單應用,只需要掌握好歸併排序的思想,**很容易寫出。
設某銀行有a、b兩個業務視窗,且處理業務的速度不一樣,其中a視窗處理速度是b視窗的2倍 —— 即當a視窗每處理完2個顧客時,b視窗處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先後到達的時間間隔,並且當不同視窗同時處理完2個顧客時,a視窗顧客優先輸出。對於本題,我們首先需要記錄每個顧客對應的結束時間,同時需要儲存使用者的id,我們使用乙個結構體來儲存。輸入為一行正整數,其中第1個數字n(≤1000)為顧客總數,後面跟著n位顧客的編號。編號為奇數的顧客需要到a視窗辦理業務,為偶數的顧客則去b視窗。數字間以空格分隔。
按業務處理完成的順序輸出顧客的編號。數字間以空格分隔,但最後乙個編號後不能有多餘的空格。
8 2 1 3 9 4 11 13 15
1 3 2 9 11 4 13 15
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對於乙個數列,我們可以先按...