2021.7.17
翻车现场
题目还是不难,难的是考虑情况(其实感觉自己已经考虑很周全了,然而细节还是漏了)
先贴一下翻车代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int star;
int end;
} node;
node num[10005];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int numm,hh,mm;
char c;
int people=0;
int sum=0;
memset(&num,0,sizeof(num));
while(scanf("%d %c %d:%d",&numm,&c,&hh,&mm)!=EOF&&numm)
{
if(c=='S')
{
num[numm].star=hh*60+mm;
}
if(c=='E')
{
if(num[numm].star)//测试点2,3没过的问题就在这里
{
num[numm].end=hh*60+mm;
sum+=(num[numm].end-num[numm].star);
people++;
num[numm].end=0;
num[numm].star=0;
}
}
}
if(people)
{
printf("%d %d\n",people,(int)(sum*1.0000/people+0.5));//注意四舍五入
}
else//除数为0的情况
{
printf("0 0\n");
}
}
}
这道题中,大部分人翻车点在于
同一本书
多个借书,一个还书,最后一次借书有效。
一个借书,多个还书,第一次还书有效。
但是我的代码做到了这一点了,后来仔细看代码才发现
if(c=='E')
{
if(num[numm].star)//问题出在这里!!!
{
num[numm].end=hh*60+mm;
sum+=(num[numm].end-num[numm].star);
people++;
num[numm].end=0;
num[numm].star=0;
}
我的计算方式是直接计算以分钟为单位的时间
实际上忽略了借书时间在00:00的情况!!!(测试点2,3中一定有这个类型的数据,多多注意!)
改了之后也就通过了,唉,就这题,做的好狼狈
AC代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node
{
int star;
int end;
int k;
} node;
node num[10005];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int numm,hh,mm;
char c;
int people=0;
int sum=0;
memset(&num,0,sizeof(num));
while(scanf("%d %c %d:%d",&numm,&c,&hh,&mm)!=EOF&&numm)
{
if(c=='S')
{
num[numm].star=hh*60+mm;
num[numm].k=1;
}
if(c=='E')
{
if(num[numm].k)
{
num[numm].end=hh*60+mm;
sum+=(num[numm].end-num[numm].star);
people++;
num[numm].end=0;
num[numm].star=0;
num[numm].k=0;
}
}
}
if(people)
{
printf("%d %d\n",people,(int)(sum*1.0000/people+0.5));
}
else
{
printf("0 0\n");
}
}
}