离散事件模拟-银行管理
现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数。逗留时间定义为 人员离开的时间减去人员来的时间。银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间。
为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=time<=18,即从中午十二点到晚上十八点,输入数据采用分钟即0代表中午12点,60代表下午一点,90代表下午一点半… 这样time>=0&&time<=360, 如果超出这个时间段概不接受,在这个时间段的一律接受。每个人到达的时间都不一样。顾客到达的时候,总是前往人数少的那个窗口。如果办业务的两个人进入离去发生在同一时间,则遵从先离去后进入。如果人数相当或者两个窗口都没有人总是前往1号窗口。请计算平均逗留时间=总逗留的分钟数/总的人数。
输入
第一行一个整数t(0<t<=100), 代表输入的组数
对于每一组输入一个整数n(0<n<=100),代表有n个人。然后是n行,每行有两个数据 x 与 y。 x代表顾客到达时间,y代表该顾客逗留时间。x y为整数(0=<x<=360)(y>0&&y<=15)。数据保证按顾客来的先后顺序输入。
输出
对于每组数据输出平均逗留时间,保留两位小数。
示例输入
1 1 60 10
示例输出
10.00
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 struct node 6 { 7 int x,y,t; 8 }; 9 10 int cmp(const void *a, const void *b) 11 { 12 struct node *c = (struct node*)a; 13 struct node *d = (struct node*)b; 14 if(c->x == d->x) 15 return c->t-d->t; 16 else return c->x-d->x; 17 } 18 19 int main() 20 { 21 struct node lis[110],que1[110],que2[110]; 22 int t,n,e1,e2,x1,x2,sum; 23 int i ,j; 24 scanf("%d",&t); 25 while(t--) 26 { 27 e1 = 0; e2 = 0;sum = 0; 28 scanf("%d",&n); 29 //lis[]存到达时间和逗留时间 30 //que1[]和que2[]存到达时间和结束时间 31 for( i = 0; i < n; i++) 32 { 33 scanf("%d %d",&lis[i].x,&lis[i].y); 34 lis[i].t = i; 35 } 36 qsort(lis,n,sizeof(lis[0]),cmp); 37 for( i = 0; i < n; i++) 38 { 39 x1 = -1; 40 x2 = -1; 41 //若1窗口没人 42 if(e1 == 0) 43 { 44 que1[0].x = lis[i].x; 45 que1[0].y = lis[i].x + lis[i].y; 46 e1++; 47 continue; 48 } 49 //若2窗口没人 50 else if(e2 == 0) 51 { 52 que2[0].x = lis[i].x; 53 que2[0].y = lis[i].x + lis[i].y; 54 e2++; 55 continue; 56 } 57 for(j = 0; j < e1; j++) 58 { 59 if(lis[i].x >= que1[j].x && lis[i].x < que1[j].y) 60 { 61 x1 = e1-j; 62 break; 63 } 64 } 65 for(j = 0; j < e2; j++) 66 { 67 if(lis[i].x >= que2[j].x && lis[i].x < que2[j].y) 68 { 69 x2 = e2-j; 70 break; 71 } 72 } 73 if(x1 == -1) 74 { 75 que1[e1].x = lis[i].x; 76 que1[e1].y = lis[i].x + lis[i].y; 77 e1++; 78 continue; 79 } 80 //若1窗口比2窗口的人多 81 if(x1 > x2) 82 { 83 que2[e2].x = lis[i].x; 84 if(que2[e2-1].y > lis[i].x) 85 que2[e2].y = que2[e2-1].y+lis[i].y; 86 else que2[e2].y = lis[i].x + lis[i].y; 87 e2++; 88 } 89 else 90 { 91 que1[e1].x = lis[i].x; 92 que1[e1].y = que1[e1-1].y+lis[i].y; 93 e1++; 94 } 95 96 } 97 for(i = 0; i < e1; i++) 98 { 99 sum += que1[i].y-que1[i].x; 100 } 101 for(i = 0; i < e2; i++) 102 { 103 sum += que2[i].y - que2[i].x; 104 } 105 printf("%.2lf\n",(sum*1.0)/n); 106 } 107 return 0; 108 }