7-1 银行业务队列简单模拟 (25 分)
題目:
設(shè)某銀行有A、B兩個業(yè)務(wù)窗口,且處理業(yè)務(wù)的速度不一樣,其中A窗口處理速度是B窗口的2倍 —— 即當(dāng)A窗口每處理完2個顧客時,B窗口處理完1個顧客。給定到達銀行的顧客序列,請按業(yè)務(wù)完成的順序輸出顧客序列。假定不考慮顧客先后到達的時間間隔,并且當(dāng)不同窗口同時處理完2個顧客時,A窗口顧客優(yōu)先輸出。
輸入格式:
輸入為一行正整數(shù),其中第1個數(shù)字N(≤1000)為顧客總數(shù),后面跟著N位顧客的編號。編號為奇數(shù)的顧客需要到A窗口辦理業(yè)務(wù),為偶數(shù)的顧客則去B窗口。數(shù)字間以空格分隔。
輸出格式:
按業(yè)務(wù)處理完成的順序輸出顧客的編號。數(shù)字間以空格分隔,但最后一個編號后不能有多余的空格。
輸入樣例:
8 2 1 3 9 4 11 13 15
輸出樣例:
1 3 2 9 11 4 13 15
思路:
創(chuàng)建兩個隊列,一個存放A窗口的客戶,另一個存放B窗口的客戶,并分別統(tǒng)計兩個窗口的人數(shù)。既然是不考慮顧客先后到達的時間間隔的話,那就統(tǒng)一輸出就可以了。
一開始把這個題想的太復(fù)雜了,后來仔細考慮了一下題中給出的條件,發(fā)現(xiàn)其實挺簡單的。
代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = 2147493647; const int maxn = 1e5+10; typedef struct QNode {int data;struct QNode *next; } QNode,*QueuePtr;typedef struct {QueuePtr frot;QueuePtr rear; } LinkQueue;bool initQueue(LinkQueue& Q) {Q.frot = Q.rear = (QueuePtr)malloc(sizeof(QNode));if(!Q.frot)exit(-2);Q.frot->next = NULL;return true; }bool DestroyQueue(LinkQueue& Q) {while(Q.frot) {Q.rear = Q.frot->next;free(Q.frot);Q.frot = Q.rear;}return true; }bool EnQueue(LinkQueue& Q, int e) {QueuePtr p = (QueuePtr)malloc(sizeof(QNode));if(p==NULL) {exit(-2);}p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return true; }bool DeQueue(LinkQueue& Q,int& e) {if(Q.frot==Q.rear)return false;QueuePtr p = Q.frot->next;e = p->data;Q.frot->next = p->next;if(Q.rear == p)Q.rear == Q.frot;free(p);return true; }bool isEmpty(LinkQueue& Q){if(Q.frot==Q.rear){return true;}return false; }int main() {int n;LinkQueue A,B;initQueue(A);initQueue(B);int even = 0,odd = 0,tmp;bool isfirst = true;cin>>n;for(int kk = 0; kk<n; kk++) {cin>>tmp;if(tmp&1) {EnQueue(A,tmp);even++;} else {EnQueue(B,tmp);odd++;}}while(even&&odd){if(even>=2 && odd>=1){int a,b,c;DeQueue(A,a);DeQueue(A,b);DeQueue(B,c);even-=2;odd--;if(isfirst){cout<<a<<" "<<b<<" "<<c;isfirst = false;}elsecout<<" "<<a<<" "<<b<<" "<<c;}else if(even==1 && odd>=1){int a,b;DeQueue(A,a);DeQueue(B,b);even--;odd--;if(isfirst){cout<<a<<" "<<b;isfirst = false;}else{cout<<" "<<a<<" "<<b;}}}while(even){int a;DeQueue(A,a);if(isfirst){cout<<a;isfirst = false;}else{cout<<" "<<a;}even--;}while(odd){int a;DeQueue(B,a);if(isfirst){cout<<a;isfirst = false;}else{cout<<" "<<a;}odd--;}return 0; } /* 樣例輸入: 8 2 1 3 9 4 11 13 15 樣例輸出: 1 3 2 9 11 4 13 15 */ View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/sykline/p/9784466.html
總結(jié)
以上是生活随笔為你收集整理的7-1 银行业务队列简单模拟 (25 分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程2
- 下一篇: Linux fork()一个进程内核态的