题意:
输入:
按照题意的意思:只有S,没有对应E的,直接不考虑;那么体现在代码中就是,在对于输入符号为E时,若当前符号,被访问过,存储了值,那么才加到总时间长t中。
对于只有E,没有S的,因为没有被访问过,自动不会被计算,前面已经涉及了。
但是对于一本书,只能被一个读者借阅,测试点却给了,一个书被多次借的情况。
一个书被多次借,按照最后一次被借为结束。直接覆盖即可,不需额外考虑。
一个书被多次还,按照第一个为准,还了以后立马置零,表示没访问过。
本来我是打算直接用a[i]里面是否有值来判断是否被访问过的,不想开标记数组,但是如果借的时间00:00,a[i]还是0,但是被借了,要测边界数据。
其实也不算题目坑人,只要别想那么多,就不想着这种情况,照样可以过的。
只需要注意,还了以后,立马把数组恢复即可。
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <algorithm>
#include <set>
#define first x
#define second y
using namespace std;
typedef pair<int,int> pii;
const int N=1e3+10;
int a[N],p[N];
int n,f;
int main(){
cin>>n;
int num=0;
int t=0;
int i;char c; int h,m;
while(1){
scanf("%d %c %d:%d",&i,&c,&h,&m);
if(c=='S' && i!=0) a[i]=h*60+m,p[i]=1;
if(c=='E' && p[i]){
num++;
t+=(h*60+m-a[i]);
p[i]=0;
}
if(i==0){
if(t==0) cout<<"0 0"<<endl;
else cout<<num<<' '<<(int)(1.0*t/num+0.5)<<endl;
num=0,t=0;
f++;
}
if(f==n) break;
}
return 0;
}