線性結構 佇列

2021-07-22 04:24:58 字數 4266 閱讀 1744

佇列

銀行業務佇列簡單模擬   (25分)

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

輸入為一行正整數,其中第1個數字n(≤\le

≤1000)為顧客總數,後面跟著n位顧客的編號。編號為奇數的顧客需要到a視窗辦理業務,為偶數的顧客則去b視窗。數字間以空格分隔。

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

8 2 1 3 9 4 11 13 15
1 3 2 9 11 4 13 15

/*

解題思路:

1)將入隊元素按題意,分別進入a佇列和b佇列;

2)再將控制出隊順序和數量即可(a優先出隊兩個,b出隊乙個)

提交**:

編譯器:g++

*/#include using namespace std;

const int maxn = 1002;

int aqueue[maxn], bqueue[maxn], ans[maxn];//a佇列、b佇列

int main()

for(int i = 0, j = 0; i < indexa || j < indexb; ++i, ++j)

for(int i = 0; i < index; ++i)

costmer[maxn];//乙個顧客包含到達時間、處理時間

struct windoww[maxw]; //視窗,其中應該有處理的人數以及結束的時間

int main()

scanf("%d", &k);

for(int i = 0; i < n; ++i)

if(w[win].endtime < minendtime)

}w[index].peo++;

if(w[index].endtime > costmer[i].atime)//計算等待時間和index視窗終止時間

else

totwaittime += waittime;//將等待時間計入總等待時間

if(waittime > maxwaittime) maxwaittime = waittime;//並得到最長的等待時間

} int endtime = w[0].endtime;

for(int i = 1; i < k; ++i)//計算整個佇列的最長結束時間

if(endtime < w[i].endtime)

endtime = w[i].endtime;

printf("%.1lf %d %d\n", 1.0 * totwaittime / n, maxwaittime, endtime);

for(int i = 0; i < k; ++i)

return 0;

}

銀行排隊問題之單視窗「夾塞」版   (30分)排隊「夾塞」是引起大家強烈不滿的行為,但是這種現象時常存在。在銀行的單視窗排隊問題中,假設銀行只有1個視窗提供服務,所有顧客按到達時間排成一條長龍。當視窗空閒時,下一位顧客即去該視窗處理事務。此時如果已知第ii

i位顧客與排在後面的第jj

j位顧客是好朋友,並且願意替朋友辦理事務的話,那麼第ii

i位顧客的事務處理時間就是自己的事務加朋友的事務所耗時間的總和。在這種情況下,顧客的等待時間就可能被影響。假設所有人到達銀行時,若沒有空視窗,都會請求排在最前面的朋友幫忙(包括正在視窗接受服務的朋友);當有不止一位朋友請求某位顧客幫忙時,該顧客會根據自己朋友請求的順序來依次處理事務。試編寫程式模擬這種現象,並計算顧客的平均等待時間。

輸入的第一行是兩個整數:1≤n≤100001\le n \le 100001≤

n≤10

000,為顧客總數;0≤m≤1000 \le m \le 1000≤

m≤10

0,為彼此不相交的朋友圈子個數。若mm

m非0,則此後mm

m行,每行先給出正整數2≤l≤1002\le l \le 1002≤

l≤10

0,代表該圈子裡朋友的總數,隨後給出該朋友圈裡的ll

l位朋友的名字。名字由3個大寫英文本母組成,名字間用1個空格分隔。最後nn

n行給出nn

n位顧客的姓名、到達時間tt

t和事務處理時間pp

p(以分鐘為單位),之間用1個空格分隔。簡單起見,這裡假設顧客資訊是按照到達時間先後順序給出的(有並列時間的按照給出順序排隊),並且假設每個事務最多占用視窗服務60分鐘(如果超過則按60分鐘計算)。

按顧客接受服務的順序輸出顧客名字,每個名字佔1行。最後一行輸出所有顧客的平均等待時間,保留到小數點後1位。

6 2

3 ann bob joe

2 jim zoe

jim 0 20

bob 0 15

ann 0 30

amy 0 2

zoe 1 61

joe 3 10

jim

zoebob

annjoe

amy75.2

解題思路:等待時間上題中已說明,這題處理大體也是這個思路,但是還要考慮插隊的情況,下面考慮如何處理插隊的情況

1)首先要將每乙個人對應到所在的朋友圈。題中給定的人名只有三個大寫字母,則對應為數字;再利用陣列對映到所在的朋友圈

2)模擬排隊時,先對朋友佇列排隊,然後再將人員排到對應朋友佇列的末尾,並更新結束時間。

3)如果朋友佇列不在在大佇列中(包括已經處理完走掉的朋友),則他作為所屬朋友佇列的對頭。

4)按題意輸出所需內容

我採用的如下資料結構儲存資訊:

提交**:

編譯器:g++

#include #include #include using namespace std;

const int maxn = 102;//朋友圈的大小

const int maxp = 18000;//人名對映為數字後的最大容量

typedef struct person per;

typedef struct friend fri;

typedef struct queue q;

struct person;//每個人

struct friend;//小佇列

struct queueq;//大佇列

struct friend *isinqueue[maxn];//用對映直接對應乙個朋友圈

int name[maxp];//用對映直接對應乙個人

int gethash(char *str);

struct queue buildqueue(void);

void push(per *tmp, q &q, int index);

int main()

}q = buildqueue();//建立佇列

for(int i = 0; i < n; ++i)

else//否則看是否可以插隊

tmpfn->endtime = nendtime;//更新之後的朋友圈

tmpfn = tmpfn->next;}}

else//如果該朋友圈的人都處理完了,只好排在隊尾}}

q.head = q.head->next;

while(q.head)//輸出處理的人員順序,並計算總等待時間

else

endtime = tmp->stime + tmp->rtime;

printf("%s\n", tmp->name);

tmp = tmp->next;

}q.head = q.head->next;

}printf("%.1lf\n", 1.0 * totwaittime / n);

return 0;

}int gethash(char *str)//原來是十進位制,錯的很莫名其妙;之後改用26進製,就對了

struct queue buildqueue(void)

void push(per *tmp, q &q, int index)

線性結構 佇列

1.佇列 queue 理解佇列,可以參考實際生活中的排隊,排隊的人只能從隊尾加入,從隊首出隊,這也是佇列的特點。即只能從隊尾新增元素,從隊首刪除元素,這也是常說的先進先出 first in first out 模擬佇列的資料結構 佇列的特點是先進先出,元素只能從佇列的尾部新增,從佇列的頭部出隊。模擬...

線性結構 佇列

佇列結構 佇列結構 queue 一種受限的線性結構 1.特點 1.佇列是一種受限的線性結構 2.先進先出,後進後出 3.在前端插入,在後端彈出 2.佇列的應用 1.列印佇列 印表機取出乙個列印乙個,直到所有文件被列印 2.執行緒佇列 多工的並行處理時,將所有的人物放入佇列,依次啟動執行緒進行處理 3...

線性結構 佇列 Queue

像棧一樣,佇列 queue 也是一種線性表,它的特性是先進先出,插入在一端,刪除在另一端。就像排隊一樣,剛來的人入隊 push 要排在隊尾 rear 每次出隊 pop 的都是隊首 front 的人。如圖1,描述了乙個佇列模型。佇列 queue 與棧一樣,是一種線性儲存結構,它具有如下特點 佇列中的資...