zoukankan      html  css  js  c++  java
  • 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)。看了之后很感慨,当时看自己一文不值,现在也觉得当年的自己很有毅力呢。。。(感觉我目前是没办法像当时那样为了一道题刷上一天了)

  • 相关阅读:
    Introduces the basic structure of Android ActivityManagerService
    创业的本质是资源整合
    android系统的经典文章
    GUI软件框架--窗口服务器
    学习法则:只接收能够体系化的知识
    编程思想:以什么样的方式来建模、分析、思考、解决问题
    怎么从本质上理解面向对象的编程思想?
    视图的对象化描述
    DOM= Document Object Model,文档对象模型---以对象管理组织(OMG)的规约为基础的
    GUI(UI编程)语言与面向对象、dsl
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10018234.html
Copyright © 2011-2022 走看看