L1-043 阅览室(测试点2,3)

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");
        }
    }

}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值