PAT クラス B 1028 国勢調査 (問題解決のアイデア + AC コード)

トピック:

町は国勢調査を実施し、すべての住民の誕生日を取得します。次に、町の最高齢者と最年少者を見つけるプログラムを作成してください。

これにより、入力された各日付は有効であることが保証されますが、必ずしも合理的であるとは限りません。町に 200 人を超える既知の人物は存在せず、今日は 2014 年 9 月 6 日であると仮定すると、200 人を超える誕生日と将来の誕生日と誕生日はすべて不合理であるため、フィルタリングする必要があります。外。

入力形式:

最初の行に正の整数Nを入力し、その値は (0,105] です。次にN行、各行に人の名前 (5 文字以下の英字で構成される文字列) を入力し、yyyy/mm/dd(つまり、年/生年月日)を押します。 MM/DD の形式で指定されます。タイトルにより、最年長と最年少の間に同数がないことが保証されます。

出力フォーマット:

有効な誕生日の数と最年長と最年少の名前をスペースで区切って 1 行に順番に出力します。

入力サンプル:

5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

出力例:

3 Tom John

コード長制限 16 KB
時間制限 200 ミリ秒
メモリ制限 64 MB

 

問題解決のアイデア

まず、メンバー変数に名前、年、月、日が含まれる Person クラスをカスタマイズします。また、= 演算子と > 演算子はオーバーロードされているため、Person クラスは代入と比較の機能を備えています。

main 関数の一般的な考え方:

  1. 可能な (妥当な) 最大年齢 (1814/09/06) と最小年齢 (2014/09/06) を指定して Person オブジェクトをインスタンス化し、動的に変化する最大年齢と最小年齢の Person オブジェクトを定義します。
  2. 動的に変更される最大年齢オブジェクトは 2014/09/06 に初期化され、動的に変更される最小年齢オブジェクトは 1814/09/06 に初期化され、動的に変更される最大年齢オブジェクトと最小年齢オブジェクトを実際のオブジェクトとして割り当てることができます。
  3. for ループを使用して各ラウンドでケースを検出します。ケースの年齢が妥当な場合、有効な誕生日の数が 1 つ増加し、動的に変化する最大年齢オブジェクトと最小年齢オブジェクトが更新されます。

注:ここで見落としやすい状況は、有効な誕生日の数が 0 である可能性があることです。この場合、最大年齢と最小年齢の名前を出力する必要はありません。

 

ACコード

#include<bits/stdc++.h>
using namespace std;

class Person{
    
    
public:
    Person();
    ~Person(){
    
    };
    Person(string name,int y,int m,int d)
    :_name(name),_year(y),_month(m),_day(d){
    
    }
    Person& operator=(const Person& per){
    
    
        _name=per._name;
        _year=per._year;
        _month=per._month;
        _day=per._day;
        return *this;
    }
    bool operator>(Person& per){
    
    
        if(this->_year!=per._year) return this->_year<=per._year;
        else if(this->_month!=per._month) return this->_month<=per._month;
        else return this->_day<=per._day;
    }
    string _name;
    int _year,_month,_day;
};

int main()
{
    
    
    int num=0;
    Person per1("qwe_per1",1814,9,6);
    Person per2("qwe_per2",2014,9,6);
    Person per_old=per2,per_young=per1;

    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
    
    
        string name;
        int year,month,day;
        cin>>name;
        scanf("%d/%d/%d",&year,&month,&day);
        Person per_temp(name,year,month,day);
        if(per1>per_temp&&per_temp>per2)
        {
    
    
            num++;
            if(per_young>per_temp)per_young=per_temp;
            if(per_temp>per_old)per_old=per_temp;
        }
    }
    cout<<num;
    if (num != 0)
    {
    
    
        cout<<" "<<per_old._name<<" "<<per_young._name;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/m0_70103775/article/details/130612307