PAT 1028 人口普查(20)(STL-set+思路+測試點分析)
阿新 • • 發佈:2019-02-06
1028 人口普查(20)(20 分)
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。
這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過200歲的老人,而今天是2014年9月6日,所以超過200歲的生日和未出生的生日都是不合理的,應該被過濾掉。
輸入格式:
輸入在第一行給出正整數N,取值在(0, 10^5^];隨後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
思路:通過定義struct(people)的比較方式,篩選出合理的人,放到set容器中(自動排序),輸出size,第一個name,最後一個name
注意:
1、size為0(有效的人數為0):不需要輸出姓名(測試點3答案錯誤)
2、使用scanf,printf(增加效率)(測試點4執行超時)
#include <iostream> #include<set> using namespace std; struct people { char name[7]; int y, m, d; bool operator <(const people &a)const { //定義結構體的比較方式 if (a.y == y) if (a.m == m) return a.d >= d; else return a.m > m; else return a.y > y; } }; int main() { set < people> myset; people temp; int n; cin >> n; while (n--) { scanf("%s %d/%d/%d", temp.name, &temp.y, &temp.m, &temp.d); if (temp < people{ "",2014,9,6 }&&people{ "",1814,9,6 } < temp) //判斷是否合理 myset.insert(temp); //放進set容器中 } cout << myset.size(); if (myset.size()) //注意當size=0時不能訪問begin cout << " " << myset.begin()->name << " " << myset.rbegin()->name; return 0; }