PAT(乙級)1018 人口普查(20)

題目來源:http://www.nowcoder.com/pat/6/problem/4054

題目描述

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程序,找出鎮上最年長和最年輕的人。



這裏確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200

歲的生日和未出生的生日都是不合理的,應該被過濾掉。

輸入描述:

輸入在第一行給出正整數N,取值在(0, 105];隨後N行,每行給出1個人的姓名(由不超過5個英文字母組成的字符串)、以及

按“yyyy/mm/dd”(即年/月/日)格式給出的生日。題目保證最年長和最年輕的人沒有並列。


輸出描述:

在一行中順序輸出有效生日的個數、最年長人和最年輕人的姓名,其間以空格分隔。

輸入例子:

5

John 2001/05/12

Tom 1814/09/06

Ann 2121/01/30

James 1814/09/05

Steve 1967/11/20

輸出例子:

3 Tom John
題目思想:人的信息使用結構體數組來存,循環讀取信息時判斷是否有效,如果有效count++;年紀最大和最小的初始都設爲第一個有效的,然後每一個與最大的和最小的比較更新最大和最小。

#include<iostream>
using namespace std;
const int year=2014;
const int month=9;
const int day=6;
struct person{
        char name[5];
        int year;
        int month;
        int day;
};
bool IsValide(person* p)
{
        bool flag=true;
        if(p->year>year)
                flag=false;
        else if(p->year==year&&p->month>month)
                flag=false;
        else if(p->year==year&&p->month==month&&p->day>day)
                flag=false;
        else
        {
                if(year-p->year>200)
                        flag=false;
                else if(year-p->year==200&&month-p->month>0)
                        flag=false;
                else if(year-p->year==200&&month-p->month==0&&day-p->day>0)
                        flag=false;
        }
        return flag;
}
int Compare(person* arr,int a,int b)
{
        int flag=1;
        if(arr[a].year>arr[b].year)
                flag=-1;
        else if(arr[a].year==arr[b].year&&arr[a].month>arr[b].month)
                flag=-1;
        else if(arr[a].year==arr[b].year&&arr[a].month==arr[b].month&&arr[a].day>arr[b].day)
                flag=-1;
        else if(arr[a].year==arr[b].year&&arr[a].month==arr[b].month&&arr[a].day==arr[b].day)
                flag=0;
        return flag;
}
int main()
{
        int n;
        int i,j;
        int min=0,max=0;
        int count=0;
        person array[100000];
        cin>>n;
        for(i=0;i<n;i++)
        {
               cin>>array[i].name>>array[i].year;
               getchar();
               cin>>array[i].month;
               getchar();
               cin>>array[i].day;
               if(IsValide(&array[i]))
               {
                       count++;
                       if(count==1)
                       {
                               max=i;
                               min=i;
                       }
                       if(Compare(array,i,max)==1)
                                max=i;
                       else if(Compare(array,i,min)==-1)
                                min=i;
               }
        }
        cout<<count<<" "<<array[max].name<<" "<<array[min].name;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章