模拟算法-银行平均等候时间,银行平均逗留时间

//银行客户平均等候时间
//要算等候时间和算逗留时间是不同的
//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);
}
posted @ 2012-10-13 00:22  Titanium  阅读(1341)  评论(0编辑  收藏  举报