L1-043 阅览室 (20分) (两个坑点)

本文介绍了一个图书借阅系统的实现方法,通过记录每本书的借阅和归还时间,确保每条借阅记录的有效性,并计算一天内每本书的总借阅时间。

题目传送门

坑点:

  • 对于一个E前面有多个S,合法的一次借阅应该是最近的S~E
  • 一本书一天之内可能被多次借阅,所以在上一次合法的借阅的处理时,应该加一个处理 vs[id] = 0
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+9;
int vs[N];//vs[i] = 1表示id位i的书开始被借了 
int s[N];//记录开始时间 
int e[N]; //记录结束时间 
int main()
{
	
    int n;
    cin>>n;
    while(n--)
    {
    
    	int id,h,m;
    	char op[3];
    	memset(vs,0,sizeof(vs));
    	int cnt = 0;
    	int sum = 0;
    	while(~scanf("%d %s %d:%d",&id,op,&h,&m))
    	{
    		if(op[0]=='S')
    		{
    			vs[id] = 1;
    			s[id] =  h*60 +m;
			}
			if(op[0]=='E'&&vs[id])//这个if的 判断必须加上vs[id] 
			{
				e[id] = h*60 +m;
				sum+= e[id]- s[id];
				// 这一步很重要 
				vs[id] = 0;
				cnt++;
			}
			if(!id)
			{
				if(!cnt) cout<<0<<" "<<0<<endl;
			else  cout<<cnt<<" "<<(int)(sum*1.0/cnt+0.5)<<endl;
			break;
			}
    	}
	}
	return 0;
}

### 关于L1-043阅览室测试4的析 针对L1-043阅览室问题中的测试4,通常涉及的是边界条件处理以及数据结构的设计合理性。以下是可能存在的错误原因及其解决方案。 #### 可能的原因 1. **未正确初始化变量** 如果`num[numm].star`或`num[numm].end`未被正确初始化,则可能导致计算时出现异常值。例如,在某些情况下可能会遗漏记录结束时间或者起始时间为零的情况[^1]。 2. **重复计数逻辑错误** 当同一本书在同一时间段内多次标记为“S”(开始)和“E”(结束),如果没有合理判断是否已经存在有效的时间段,则会引发重复统计的问题[^5]。 3. **时间转换不一致** 时间从字符串形式转化为钟数的过程中可能出现误差,比如对于输入格式`hh:mm`未能严格校验合法性并统一存储方式[^4]。 #### 解决方案代码示例 下面提供一段修正后的C++代码片段来应对上述潜在问题: ```cpp #include <iostream> #include <vector> using namespace std; struct Book { int star; int end; }; int main() { vector<Book> num(1001); int n, c_num, hh, mm; char action; cin >> n; while(n--) { cin >> c_num >> action >> hh >> mm; if(action == 'S') { if(!num[c_num].star && !num[c_num].end){ num[c_num].star = hh * 60 + mm; // 转化成总钟数 } } else if(action == 'E'){ if(num[c_num].star){ // 确保有对应的'S'操作才执行'E' num[c_num].end = hh * 60 + mm; static int sum = 0, people = 0; sum += (num[c_num].end - num[c_num].star); people++; cout << people << " " << sum / people << endl; // 输出当前统计数据 num[c_num].star = 0; // 清理状态以便后续使用 num[c_num].end = 0; } } } return 0; } ``` 此代码通过增加额外的状态检查确保每次仅当一本书确实处于借用状态下才会更新其归还时间和累计阅读时间,并且及时清除了已完成的操作标志位以防干扰下一次循环运算过程[^2]。 #### 注意事项 - 对于每本新书首次登记借阅行为之前需确认该书籍尚未开启任何活动周期。 - 结束动作必须匹配最近的一次启动事件;否则忽略此次终止信号以免造成虚假延长实际停留时段的现象发生。 - 所有的时间均应标准化表示方法便于比较与累加操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值