L1-043. 阅览室
题目地址:https://www.patest.cn/contests/gplt/L1-043
思路:
(1)用一个结构体储存一天的借阅次数和平均阅读时间,再用一个结构体储存一天内一本书的操作,书号,借阅时间,还书时间。
(2)读取一行,若是一天结束,重复(2),也即下一天。
(3)若为借还书,A。借:则查找这本书是否已被借阅但未显示归还(由于线路偶尔会有故障,可能出现不完整的纪录),是:在原来的位置储存借书时间。否:为新书,新建借 书id和借书时间。
B。还:则查找这本书是否有记录借过,若借过,则记录还书时间,将阅读时间加到当天总的阅读时间中,借阅次数加一。删除借阅记录。否:跳过。
注意点:(1)输入格式,(2)事件可能的情况考虑清楚。
(3)一次读取一行的内容,比较好,若先读取一个,则容易出错。
1 #include<stdio.h> 2 int main() 3 { 4 struct day{ 5 int num; 6 int time; 7 }; 8 struct day dy[10]; 9 int N; 10 scanf("%d",&N); 11 int d; 12 for(d=0;d<N;d++) //N天 13 { 14 struct book{ 15 int id; 16 int tj; 17 int th; 18 }; 19 struct book bk[1000]; 20 dy[d].num=0,dy[d].time=0; //借阅次数0,阅读时间0 21 int i; 22 i=0; //每天借阅的xin书次数 23 while(1) //一天 24 { 25 char ch; 26 int a,t1,t2; 27 scanf("%d %c %d:%d",&a,&ch,&t1,&t2); //输入格式???????????、 28 if(a==0)goto nextday; //输入0直接进入下一天 29 else 30 { 31 if(ch=='S') //借 32 { 33 int j; 34 j=0; 35 for(j=0;j<i;j++) //此书是否已经借出过 36 { 37 if(bk[j].id==a) //借出过 且未记录到还 38 { 39 bk[j].tj=t1*60+t2; //重新存借阅时间 40 // bk[j].th=-1; //还时间为-1 41 goto nextstep; 42 } 43 } 44 if(j==i) //未借阅过 45 { 46 bk[i].id=a; //存数号 47 bk[i].tj=t1*60+t2; //存借阅时间 48 i++; //未借过 49 } 50 }//借 51 else //还 52 { 53 int j; 54 for(j=0;j<i;j++) //查找是否借阅 55 { 56 if(bk[j].id==a) //是借阅的书 57 { 58 bk[j].th=t1*60+t2; //存还书时间。 59 dy[d].time+=bk[j].th-bk[j].tj; //将阅读时间加到一天的阅读时间中 60 dy[d].num++; //借阅还书次数加一 61 bk[j].id=-1; //清处借书 62 goto nextstep; 63 } 64 } 65 }//借书还书还书 66 nextstep:; 67 }//一天的操作 68 }//一天是否结束 69 nextday:; 70 } 71 for(d=0;d<N;d++) 72 { 73 if(dy[d].num==0)printf("0 0\n"); 74 else printf("%d %.0f\n",dy[d].num,(float)dy[d].time/dy[d].num); 75 } 76 return 0; 77 }