PAT 1028 人口普查 20

2021-08-15 18:31:21 字數 1354 閱讀 3318

題目描述:

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

這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2023年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
題目分析:

本題目的一大難點是判斷所輸入年齡的有效性以及年齡的比較,大於兩百歲的無效,晚於2014/9/6的也是無效。對於有效年齡,筆者認為不妨忽略閏年的差異,將每年的天數設定為365天,每乙個月設定為30天。因為同年或者同月的人在比較時都做了相同的處理,而不同年或者不同月的人年齡比較時相差的年數或者月數足足以彌補我們這樣處理的差異。根據每人的出生年月日算出當前情況下的已經生活的天數,再進行比較。筆者又設定計算該天數的函式。我在設定引數時,盡量見文知意。請參考一下**:

#include

const int maxn=100001;

struct peopleple[maxn];

struct datetime

};int birth(int year,int month,int day)

else

if(month>today.month )

else

tianshu+=365*(today.year -year);      //最後處理年份 

return tianshu;

}int main()

else if(year==2014&&month>9)

else if(year==2014&&month==9&&day>6)

else

if(ple[i].days>max)} }

}printf("%d",count);            //輸出有效資訊個數 

for(int i=0;iif(ple[i].days==max)

} for(int i=0;i if(ple[i].days==min) }}

PAT1028人口普查 20

人口普查 20 時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有...

PAT 1028 人口普查 20

題目概述 某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入在第一行給...

PAT 1028人口普查

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。這裡確保每個輸入的日期都是合法的,但不一定是合理的 假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。輸入格式 輸入在第一行給出正整數n...