模拟算法-银行平均等候时间,银行平均逗留时间
//银行客户平均等候时间
//要算等候时间和算逗留时间是不同的
//t1[i]表示第i个人的到达时间,t[i]表示第i个人办理时间,t2[i]表示第i个人离开时间,time[i]表示第i个人的等候时间
//我们要算平均等候时间,其实就是time数组累加求和然后除以n即可
//对于第1个人,他不需要等待,来到就办理,所以等待时间为0
//对于第i个人,如果他来到的时候第i-1个人刚刚离开或者已经离开,那么他也不需要等待直接办理,他的情况和第1个人是一样,等待时间为0
//即time[i]=0;
//如果第i个人来到,但是第i-1个人还没有离开,那么他就要等待,他的等待时间是(第i-1个人的离开时间-第i个人的到达时间)
//即time[i]=t2[i-1]-t1[i];
//而第i个人的离开时间是(第i-1个人的离开时间+第i个人的办理时间)
//即t2[i]=t2[i-1]+t[i];
#include <stdio.h> #include <string.h> #define MAX 110 int t1[MAX],t[MAX],t2[MAX],time[MAX]; //t1表示到达时间,t表示办理时间,t2表示离开时间,time表示等候时间 int n; int main() { int i,sum; double ave; scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d",&t1[i]); scanf("%d",&t[i]); } time[1]=0; t2[1]=t1[1]+t[1]; for(sum=0,i=2; i<=n; i++) { if(t1[i] >= t2[i-1]) //如果第i个人的到达时间比第i-1个人的离开时间要晚,那么他不需要等待 { time[i]=0; //等待时间为0 t2[i]=t1[i]+t[i]; //他的离开时间就是他的到达时间+办理时间 } else //第i个人来到的时候第i-1个人还没有离开 { time[i]=t2[i-1]-t1[i]; //第i个人的等待时间是第i-1个人的离开时间-第i个人的到达时间 t2[i]=t2[i-1]+t[i]; } sum+=time[i]; //对time数组累加求和 } // 需要查看最终所有数组的构建情况,把注释去掉就可查看 // printf("t1数组: "); for(i=1; i<=n; i++) printf("%d ",t1[i]); printf("\n"); // printf("t数组: "); for(i=1; i<=n; i++) printf("%d ",t[i]); printf("\n"); // printf("t2数组: "); for(i=1; i<=n; i++) printf("%d ",t2[i]); printf("\n"); // printf("time数组: "); for(i=1; i<=n; i++) printf("%d ",time[i]); printf("\n"); ave=sum*1.0/n; printf("%.2lf\n",ave); }
//银行平均等候时间
//输入中给出每个人的到达时间和办理业务所花的时间
//算法分析
//对已第i个人,他的到达银行时间为t1,离开银行时间为t2,那么他在银行的逗留时间是t2-t1
//tim[i]表示第i个人在银行的逗留时间
//要算出n个人的平均逗留时间,那么就是对整个time数组进行累加然后除以n即可
//解决的问题关键是怎么算出一个人在银行的逗留时间
//特殊的,对于第1个人,他的逗留时间就是他的到达时间+办理业务所花时间
//对于其他人可能有两种情况
//1.来到了银行,但是前面的人还没有走,那么他还要等,然后再办理
//所以他的逗留时间其实是(前一个人的离开时间+自己的办理时间-自己的到达时间)
//2。来到银行,前面的人刚刚离开(同时离开)或提前离开了,那么这个人不需要等待,直接就去办理
//所以这种人的逗留时间和第1个人是一样的
//所以根据上面的分析,我们需要获取的信息有
//自己的到达时间,办理时间(即输入),前一个人的离开时间
#include <stdio.h> #include <string.h> #define MAX 100 int t1[MAX],t2[MAX],t[MAX],time[MAX]; //t1[i]表示第i个人到达银行的时间, t2[i]表示第i个人离开银行的时间, //t[i]表示第i个人办理的时间, time[i]表示第i个人逗留时间 int n; int main() { int i,sum; double ave; scanf("%d",&n); //有n个人 for(i=1; i<=n; i++) { scanf("%d",&t1[i]); //第i个人到达银行的时间 scanf("%d",&t[i]); //第i个人办理所需时间 } t2[1]=t1[1]+t[1]; //第1个人的离开时间就是他的到达时间+办理时间 time[1]=t[1]; //第1个人的逗留时间就是他的办理时间因为他不需要等待 sum=time[1]; for(i=2; i<=n; i++) { if(t1[i] >= t2[i-1]) //如果第i个人的到达时间大于或等于第i-1人的离开时间,那么他可以直接办理业务 { t2[i]=t1[i]+t[i]; //他的离开时间就是到达时间+办理时间,情况和第1个人是一样的 time[i]=t[i]; //逗留时间就是办理时间 } else //第i个人来到时第i-1个人还没有走 { t2[i]=t2[i-1]+t[i]; //第i个人要在第i-1人离开的时候去办理,所以离开时间是(第i-1个人的离开时间+第i个人的办理时间) time[i]=t2[i]-t1[i]; //第i个人的逗留时间就是(自己的离开时间-到达时间) } sum+=time[i]; //把第i个人的逗留时间加上去 } // 需要查看最终所有数组的构建情况,把注释去掉就可查看 // printf("t1数组: "); for(i=1; i<=n; i++) printf("%d ",t1[i]); printf("\n"); // printf("t数组: "); for(i=1; i<=n; i++) printf("%d ",t[i]); printf("\n"); // printf("t2数组: "); for(i=1; i<=n; i++) printf("%d ",t2[i]); printf("\n"); // printf("time数组: "); for(i=1; i<=n; i++) printf("%d ",time[i]); printf("\n"); ave=sum*1.0/n; printf("%.2lf\n",ave); }