您的位置:首页 > 其它

L1-043. 阅览室

2018-03-29 09:57 316 查看

L1-043. 阅览室

题目链接:点击打开链接

时间限制400 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者陈越
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。输入格式:输入在第一行给出一个正整数N(<= 10),随后给出N天的纪录。每天的纪录由若干次借阅操作组成,每次操作占一行,格式为:书号([1, 1000]内的整数) 键值(“S”或“E”) 发生时间(hh:mm,其中hh是[0,23]内的整数,mm是[0, 59]内整数)每一天的纪录保证按时间递增的顺序给出。输出格式:对每天的纪录,在一行中输出当天的读者借书次数和平均阅读时间(以分钟为单位的精确到个位的整数时间)。输入样例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
输出样例:
2 196
0 0
1 60

分析:
记得有一次比赛中遇见了一个和这题类似的题,如果没记错的话,题目是借船,和这个题一样,可能我的思路太复杂,考虑的太多,控制的还不得当,所以错了,事后看了一篇写的让我很迷的博客,所以这种题感觉还是需要找到好的方法,培养锻炼思维,我一直都有读题不仔细的习惯,在这个上面没少吃亏,同样,本题也是,题中说题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。 好,我没注意这里是题目保证四个字,我在出现有 S 的的数据中还特意判断一下,如果已经有人借了并且没有归还的记录就不存储该数据,于是总是拿不到满分,好了,从我这个代码中学到了不少,比如日期之间的计算,之前都是时和分单独判断,无比的麻烦,这个就省事多了,还有 map 与结构体的混合,第一次在 map 里映射结构体,好东西。

#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<math.h>
#include<map>
using namespace std;

struct book{///存借书的时间
int a,b;
};

int s[10005];

map<int ,book>p;///与结构体配合使用

int main()
{
int n,x,y,k;
char c;
scanf("%d",&n);
while(n--)
{
memset(s,0,sizeof(s));///注意是按天计算,所以对于每一天都要将数据重新清空
int num=0;
int sum=0;
p.clear();
while(scanf("%d %c %2d:%2d",&k,&c,&x,&y)&&k)
{
if(c=='S')///存借书的信息
{
s[k]=1;
p[k].a=x;
p[k].b=y;
}
else if(c=='E'&&s[k])///归还时做计算
{
num++;
sum+=(x*60+y)-(p[k].a*60+p[k].b);
s[k]=0;
}
}
if(num==0)///说明数据不完整或者没有人借书
printf("0 0\n");
else
{
int jun=((sum*1.0)/(num*1.0))+0.5;
printf("%d %d\n",num,jun);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: