L1-043 阅览室 (20分)

本文深入解析了一种用于图书馆借阅系统的时间计算算法,通过两段不同版本的代码对比,详细介绍了如何准确记录图书的借阅次数及平均借阅时间,强调了正确处理重复借阅和还书操作的重要性。

L1-043 阅览室 (20分)

题目详情:
在这里插入图片描述
AC代码:(第二版)

#include<iostream>
#include<cstring>//头文件
#include<iomanip>
using namespace std;
int main()
{
    int n,i,hh,mm,num,time,h[1001],m[1001],flag[1001];
    char s,c;
    cin>>n;
    while(n--)
    {
        memset(flag,0,sizeof(flag));
        memset(h,0,sizeof(h));
        memset(m,0,sizeof(m));
        num=0;//借书次数
        time=0;//总借阅时间
        while(cin>>i>>s>>hh>>c>>mm&&i!=0)
        {
            if(s=='S')//借书
            {
                flag[i]=1;//借阅后标记为1
                h[i]=hh;//借书的时
                m[i]=mm;//借书的分
            }
            else//还书
            {
                if(flag[i]==1)
                {
                    flag[i]=0;//再次碰见该书号,则说明是借书
                    time=time+(hh-h[i])*60+mm-m[i];
                    num++;
                }
            }
        }
        if(num==0)
            cout<<"0 0"<<endl;
        else
            cout<<num<<' '<<fixed<<setprecision(0)<<1.0*time/num<<endl;//四舍五入
    }
    return 0;
}

这道题处理时注意只有一借一还才算,其他的只借或者只还是不算的。如果一本书由于线路问题显示借了两次,后面也还了,那么借的那次以最后一次借的时间为准。代码中只要碰到同一书号借书,不断更新时间就是这个道理,即借书时间记的总是最后一次。如果碰到还书且该书借过,那么借书次数加1且借书总时也加。该题存储时将书号作为flag数组的下标,这种做法很巧妙。类似还有很多题都是将一些量作为数组的下标,做题时要善于发现,要对这一类技巧越来越敏感。

运行结果:
在这里插入图片描述
AC代码:(第一版)

#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
int main()
{
    int a[10001]={0},c[10001]={0},d[10001]={0},n,i,j,k,h,time,times;
    char b[10001]={'a'};
    cin>>n;
    for(i=1;i<=n;i++)
    {
        j=1;
        while(scanf("%d %c%d:%d",&a[j],&b[j],&c[j],&d[j])&&a[j]!=0)
            j++;
        times=0;
        time=0;
        for(k=1;k<j-1;k++)
        {
            for(h=k+1;h<j;h++)
            {
                if(a[k]==a[h]&&b[k]=='S'&&b[h]=='S')
                {
                    a[k]=-1;
                }
                if(a[k]==a[h]&&b[k]=='S'&&b[h]=='E'&&a[k]>0&&a[h]>0)
                {
                    time=time+c[h]*60+d[h]-(c[k]*60+d[k]);
                    times++;
                    a[k]=-1;
                    a[h]=-1;
                    break;
                }
            }
        }
        if(time==0)
            cout<<"0 0"<<endl;
        else
        {
            cout<<times<<' '<<fixed<<setprecision(0)<<time*1.0/times<<endl;
        }
    }
    return 0;
}

运行结果:
在这里插入图片描述
这个做法是我第一次做的,显然感觉没有什么技巧。建议好好领悟第二版AC代码的技巧。

永远相信美好🎈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信小海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值