PAT乙1028.国勢調査(20)


1028.国勢調査(20)
タイトルアドレス:1028.国勢調査
タイトルの説明:
ある町で国勢調査を行い、住民全員の誕生日を得た.今プログラムを書いて、町で一番年上と一番若い人を見つけてください.ここでは、入力された日付が合法的であることを確認しますが、必ずしも合理的ではありません.町に200歳を超えた高齢者がいないと仮定し、今日は2014年9月6日なので、200歳を超えた誕生日と生まれていない誕生日は合理的ではありません.フィルタリングされるべきです.
  • 入力フォーマット:最初の行に正の整数Nを入力し、値を(0,105)にします.その後、N行に1人の名前(5文字以下の文字列)、および「yyyy/mm/dd」(年/月/日)形式で与えられた誕生日を入力します.最高齢者と最年少者が並んでいないことを保証します.
  • 出力フォーマット:有効な誕生日の個数、最高齢者、および最若者の名前を1行ずつ順番に出力し、その間をスペースで区切る.

  • テーマ分析:この問題は比較する時、数値と比較して有効にコード量を短縮することができます.年月日を比較するのにif elseサイクルが必要なため、面倒です.また、最初の提出時にテスト用例のフォーマットが正しくありません.最後に、入力が1つの量で不合理な場合、if elseで出力を判断しないと、フォーマットが間違っていることがわかりました.
    プログラム:
    #include 
    #include 
    #include 
    using namespace std;
    
    int main()
    {
        int N;
        scanf("%d", &N);
        int year[N], month[N], day[N];
        char name[N][20];
        int vaild = 0;
        int older = 2013*365+8*30+6, younger = 1813*365+8*30+6;
        string oldName, youngName;
        for (int i = 0; i < N; i++)
        {
            scanf("
    %s %d/%d/%d"
    , &name[i], &year[i], &month[i], &day[i]); // printf("
    %s %d/%d/%d"
    , name[i], year[i], month[i], day[i]); if ((year[i]-1)*365 + (month[i]-1)*30 + day[i] > 2013*365+8*30+6 || (year[i]-1)*365 + (month[i]-1)*30 + day[i] < 1813*365+8*30+6) { continue; } else { if ((year[i]-1)*365 + (month[i]-1)*30 + day[i] < older) { older = (year[i]-1)*365 + (month[i]-1)*30 + day[i]; oldName = name[i]; } if ((year[i]-1)*365 + (month[i]-1)*30 + day[i] > younger) { younger = (year[i]-1)*365 + (month[i]-1)*30 + day[i]; youngName = name[i]; } vaild++; } } if (vaild) { cout << vaild << " " << oldName << " " << youngName << endl; } else { cout << vaild <