アルゴリズムの美しさ--ドアを開ける人とドアを閉める人(printf,scanf用法)

2579 ワード

まずprintf、scanfの使い方をよく復習します~
タイトルの説明:
毎日最初に機械室に着いた人はドアを開け、最後に離れた人はドアを閉めなければならない.雑然とした機械室のサイン、サインオフの記録があるので、記録に基づいて当日ドアを開けたり閉めたりする人を見つけてください.
入力:
テスト入力の最初の行は、記録の合計日数N(N>0)を与え、以下にN日の記録を示す.毎日の記録は1行目に記録されたエントリ数M(M>0)を与え、以下はM行であり、各行のフォーマットは証明書番号の署名時間の署名時間であり、時間は「時間:分:秒」(各2ビット)で与えられ、証明書番号は長さが15を超えない文字列である.
出力:
毎日の記録に1行、すなわち当日の開門者と閉門者の証明書番号を出力し、真ん中を1スペースで区切る.注意:審判の標準テスト入力では、すべての記録が完全であることが保証され、各人の署名時間は署名時間の前であり、同時に署名したり、署名したりする人は多くありません.
サンプル入力:
3
1
ME3021112225321 00:00:00 23:59:59
2
EE301218 08:05:35 20:56:35
MA301134 12:35:45 21:40:42
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40

サンプル出力:
ME3021112225321 ME3021112225321
EE301218 MA301134
SC3021234 CS301133

 
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string"
using namespace std;
 
 struct Time
{
    int h,m,s;
    bool operator <(const Time a) const
    { 
        if(a.h==h&&a.m==m) return s<a.s;
        else if(a.h==h) return m<a.m;
        else return h<a.h;
    }
};
 
void Equal(Time src,Time des)
{
    des.h=src.h,des.m=src.m,des.s=src.s;
}

struct Peo
{
    char id[30];
    Time t1,t2;  
};

int main()
{
    int cas,n;
    scanf("%d",&cas);
    Peo p;
    char id1[30],id2[30];
    while(cas--)
    {
        scanf("%d",&n);
        Time maxx,minn;
        scanf("%s %d:%d:%d %d:%d:%d",&id1,&minn.h,&minn.m,&minn.s,&maxx.h,&maxx.m,&maxx.s);
        strcpy(id2,id1);
        while(--n)
        {
            scanf("%s %d:%d:%d %d:%d:%d",&p.id,&p.t1.h,&p.t1.m,&p.t1.s,&p.t2.h,&p.t2.m,&p.t2.s);
            if(p.t1<minn)
            {
                Equal(p.t1,minn);
                strcpy(id1,p.id);
            }
            if(maxx<p.t2)
            {
                Equal(p.t2,maxx);
                strcpy(id2,p.id);
            }
        }
        printf("%s %s
",id1,id2); } }