美文网首页PAT
1006 Sign In and Sign Out

1006 Sign In and Sign Out

作者: 胖胖的熊管家 | 来源:发表于2020-04-11 20:43 被阅读0次

    题目

    一天中,进入机房的人都有记录何时进,何时出。第一个进机房的人不关门,最后一个出机房的人关门。
    目标:找出一天中谁不关门,谁关门

    Sample Input
    3
    CS301111 15:30:28 17:00:10
    SC3021234 08:00:00 11:25:25
    CS301133 21:45:00 21:58:40
    
    Sample Output
    SC3021234 CS301133
    

    解法

    法一:C++
    思路:

    就是比较时间的大小嘛,或者说对时间排序,最后找出最大的和最小的。
    在刚开始的时候想存储int时分秒这样来判断,通过时间优先级,时>分>秒。

    源代码:
    #include <iostream>
    #include <cstdio>
    #include <math.h>
    #include<vector>
    #include <string.h>
    #include <sstream>
    
    using namespace std;
    
    int main() {
        int num;
        scanf("%d",&num);
        
        string id_number = "";
        int inh,inm,ins,outh,outm,outs;
        
        int maxh,maxm,maxs,minh,minm,mins;
        maxh=maxm=maxs=0;
        minh=minm=mins=999;
        string unlockone,lockone;
        
        for(int i=0;i<num;i++){
            cin>>id_number;
            scanf("%d:%d:%d %d:%d:%d",&inh,&inm,&ins,&outh,&outm,&outs);
            if(inh<minh){
                minh = inh;
                unlockone = id_number;
            }
            else if(inh == minh && inm<minm){
                minm = inm;
                unlockone = id_number;
            }
            else if(inh == minh && inm == minm && ins<mins){
                mins = ins;
                unlockone = id_number;
            }
            
            if(outh>maxh){
                maxh = outh;
                lockone = id_number;
            }
            else if(outh == minh && outm>minm){
                maxm = outm;
                lockone = id_number;
            }
            else if(outh == minh && outm == minm && outs>mins){
                maxs = outs;
                lockone = id_number;
            }
            
        }
        //printf("%s %s",unlockone.c_str(),lockone.c_str()); //非要用printf输出的话,要加.c_str().
        cout<<unlockone<<" "<<lockone<<endl;//注意格式,中间有个空格!
        
        return 0;
    }
    

    法二:C++
    思路:

    法一是原创的,但是发现用if...else...判断的代码看起来有点长,所以去参考了柳神的代码思路。
    她是将时间都转换为总秒数,然后进行时间的比较的。

    源代码:
    #include <iostream>
    #include <cstdio>
    #include <math.h>
    #include<vector>
    #include <string.h>
    #include <sstream>
    
    using namespace std;
    
    int main() {
        int num;
        scanf("%d",&num);
        
        string id_number = "";
        int inh,inm,ins,outh,outm,outs;
        
    
        int max=0,min=9999999;
        int tempin=0,tempout=0;
        string unlockone,lockone;
        
        for(int i=0;i<num;i++){
            cin>>id_number;
            scanf("%d:%d:%d %d:%d:%d",&inh,&inm,&ins,&outh,&outm,&outs);
            tempin = inh * 3600 + inm * 60 + ins;
            tempout = outh * 3600 + outm * 60 + outs;
            if(tempin < min){
                unlockone = id_number;
                min = tempin;
            }
            if(tempout > max){
                lockone = id_number;
                max = tempout;
            }
        }
         cout<<unlockone<<" "<<lockone<<endl;
        
        return 0;
    }
    

    知识点+坑:
    1. string的输入

    (刚开始用scanf+%s,这是不行的。因为c中没有string类,而c++中有,所以用cin)

    cin>>输入的string;
    

    2.在用法二的时候,要注意min的值,太小的话就不行了。

    相关文章

      网友评论

        本文标题:1006 Sign In and Sign Out

        本文链接:https://www.haomeiwen.com/subject/vnzumhtx.html