1006. Sign In and Sign Out (25)

Posted chanwunsam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1006. Sign In and Sign Out (25)相关的知识,希望对你有一定的参考价值。

这道题今天也顺便做完了,虽然AC了但是心有余悸。

技术分享图片

题目意思很简单,找出其中最早来的和最晚走的。难点是时间很明显要用字符串储存,也就是转化类型的一个问题。另一个地方是ID长度是不固定的,也就是说你只能靠空格来判断ID是否输入完毕。

一开始想用string但是总是出问题,就改用字符数组。后来再换回来又没问题了……

/* 题目:1006      */
/* 作者:ChanWunsam    */
/* 时间:2017.12.21    */
#include <cstdio>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

struct Node{
    char ID[16];
    char SignInTime[9];
    char SignOutTime[9];
};
typedef struct Node *Student;


int transTime(char S[]);
int atoi(char S[], int a, int b);

int main()
{
    //freopen("C:\Users\ChanWunsam\Desktop\pat\pat_in.txt","r",stdin);
    //freopen("C:\Users\ChanWunsam\Desktop\pat\pat_out.txt","w",stdout);
    
    int M, i, j, k, *InTime, *OutTime, First, Final;
    char ID[16], In[9], Out[9];
    Student S;
    cin>>M;

    S=(struct Node *)malloc(M*sizeof(struct Node));
    InTime=(int *)malloc(M*sizeof(int));
    OutTime=(int *)malloc(M*sizeof(int));
    
    /* 输入 */
    for(i=0; i<M; i++)
    {
        cin>>ID>>In>>Out;
        strcpy(S[i].ID, ID);
        strcpy(S[i].SignInTime, In);
        strcpy(S[i].SignOutTime, Out);
    }
    
    /* 转化类型,并统计时间 */ 
    for(i=0; i<M; i++)
    {
        InTime[i]=transTime(S[i].SignInTime);
        OutTime[i]=transTime(S[i].SignOutTime);
    }
    
    /* 找出最早来的和最晚走的 */ 
    First=Final=0;
    for(i=1; i<M; i++)
    {
        if(InTime[i]<InTime[First])
            First=i;
        if(OutTime[i]>OutTime[Final])
            Final=i;
    }
    cout<<S[First].ID<<" "<<S[Final].ID;

    return 0;
}

/* 将时间字符转化为以秒为单位的整形数值 */
int transTime(char S[])
{
    int Time;
    Time=atoi(S,0,1)*3600+atoi(S,3,4)*60+atoi(S,6,7);
    return Time;
}

/* 将下标a-b的字符串转化为整形并返回值 */ 
int atoi(char S[], int a, int b)
{
    int i, Num;
    Num=0;
    for(i=a; i<=b; i++)
    {
        Num*=10;
        Num+=S[i]-‘0‘;
    }
    return Num;
}

总觉得自己的很不规范,也就写题这样做做吧,要是做工程肯定被打死。


看了下别人的做法,这一次思路完全不一样了。我是将输入值全部看作字符,大神的做法是将“:”看作运算符重载,然后时间用一个结构体储存。不好说谁的做法更高明,但很明显他的基础会比我更好。
附上:http://blog.csdn.net/apie_czx/article/details/45363435


时间复杂度:

技术分享图片

时间永远不及大神的,很无奈……


一年后补更:
当年的PAT刷题笔记只记到这里,很惭愧。当然,当时PAT不只是刷到这里,只是笔记速度更不上,后来不知怎么就都放弃了(想想,应该是期末考,再加上后来兴趣转向unity)。看了之后很感慨,当时看自己一文不值,现在也觉得当年的自己很有毅力呢。。。(感觉我目前是没办法像当时那样为了一道题刷上一天了)



以上是关于1006. Sign In and Sign Out (25)的主要内容,如果未能解决你的问题,请参考以下文章

1006 Sign In and Sign Out (25)

1006. Sign In and Sign Out (25)

1006. Sign In and Sign Out (25)

1006. Sign In and Sign Out (25)

1006 Sign In and Sign Out

1006 Sign In and Sign Out