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代码的技巧。
永远相信美好🎈
本文深入解析了一种用于图书馆借阅系统的时间计算算法,通过两段不同版本的代码对比,详细介绍了如何准确记录图书的借阅次数及平均借阅时间,强调了正确处理重复借阅和还书操作的重要性。

4124

被折叠的 条评论
为什么被折叠?



