本文主要是介绍L1-043 阅览室(卡细节),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
L1-043 阅览室
输入样例:
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
思路
只需要记录 有效借书时间区段和,有效借书次数 即可
1.有效借书时间区段和
总时间的计算:化成分钟 ,(还书时间 - 借书时间)累加和借书时间:该书最后一次被借出时间有效,在此之前都是系统的故障还书时间:当且仅当该在时间之前存在该书的借书记录时,还书时间有效,否则不予记录。(就是在还书时间点前,该书被借过)
2.有效借书次数
略~略~略~
3.坑点
出题人不讲武德啊,居然趁我初始化数组的时候偷袭我,我大意了啊,没有闪!
1.时间为0:00的时候,记录时间就为0,可能与数组初始化冲突,影响判断条件
(比如,if语句以大于0做判断条件,漏掉等于0的情况)
2.多个借书时间,以最后一个为准,之前的都是系统出的故障
3.还书记录以排在前面的先记录,只有还没有借则不记录。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1100
int t,num,h,m;
int a[N];
char c;int main() {scanf("%d",&t);while(t--) {int sum=0,cnt=0;memset(a,-1,sizeof(a)); //不要初始化为0while(~scanf("%d %c %d:%d",&num,&c,&h,&m)&&num) {if(c=='S')a[num]=h*60+m;else if(c=='E'&&a[num]>=0) { //注意>=0sum+=(h*60+m-a[num]);cnt++;a[num]=-1; //及时初始化}}if(!cnt)printf("0 0\n");elseprintf("%d %d\n",cnt,(int)(1.0*sum/cnt+0.5));}return 0;
}
这篇关于L1-043 阅览室(卡细节)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!