PAT乙 1028 人口普查
题目
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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
题解
#include <bits/stdc++.h>
void stringSplit(std::string str, const char split, std::vector<std::string>& result) {
std::stringstream ss(str);
std::string token;
while(std::getline(ss, token, split))
result.push_back(token);
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int N, count = 0, old_date = INT_MAX, young_date = INT_MIN;
std::cin >> N;
std::string name, date, old_name = "", young_name = "";
int s = 1814 * 365 + 9 * 30 + 6, b = 2014 * 365 + 9 * 30 + 6;
while(N--) {
std::cin >> name >> date;
std::vector<std::string> temp;
stringSplit(date, '/', temp);
int y = std::stoi(temp[0]), m = std::stoi(temp[1]), d = std::stoi(temp[2]);
int time = y * 365 + m * 30 + d;
if(time < s || time > b) continue;
count += 1;
time -= s;
if(time < old_date) {
old_name = name;
old_date = time;
}
if(time > young_date) {
young_name = name;
young_date = time;
}
}
if(count == 0) std::cout << count << std::endl;
else std::cout << count << " " << old_name << " " << young_name << std::endl;
return 0;
}