1028 人口普查
一、题目
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
二、输入输出
输入格式
输入在第一行给出正整数 N,取值在(0,
1
0
5
10^5
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
四、题目分析
按照题意,只需要定义对人的年龄进行比较的方法即可。这里提供两种方法:一种是自定义比较函数,使用vector
存储,用sort
排序,另一种方法是使用mutiset,通过重载操作符<
来排序。
五、代码
-
vector+sort
#include<bits/stdc++.h> using namespace std; struct Person{ string name; int yy; int mm; int dd; }; bool cmp(Person p1,Person p2){ if(p1.yy!=p2.yy){ return p1.yy>p2.yy; } else if(p1.mm!=p2.mm){ return p1.mm>p2.mm; } else return p1.dd>=p2.dd; } int main(){ Person p_max; p_max.yy=1814; p_max.mm=9; p_max.dd=6; Person p; Person p_min; p_min.yy=2014; p_min.mm=9; p_min.dd=6; vector<Person> people; int n; cin>>n; for(int i=0;i<n;i++){ cin>>p.name; scanf("%d/%d/%d",&p.yy,&p.mm,&p.dd); if(cmp(p,p_max)&&cmp(p_min,p)){ people.push_back(p); } } sort(people.begin(),people.end(),cmp); cout<<people.size(); if(people.size()) cout<<' '<<people[people.size()-1].name<<' '<<people[0].name; }
-
mutiset
#include<bits/stdc++.h> using namespace std; struct Person{ string name; int yy; int mm; int dd; bool operator <(const Person& p)const{ if(yy!=p.yy){ return yy>p.yy; } else if(mm!=p.mm){ return mm>p.mm; } else return dd>=p.dd; } }; int main(){ Person p_max; p_max.yy=1814; p_max.mm=9; p_max.dd=6; Person p; Person p_min; p_min.yy=2014; p_min.mm=9; p_min.dd=6; multiset<Person> people; int n; cin>>n; for(int i=0;i<n;i++){ cin>>p.name; scanf("%d/%d/%d",&p.yy,&p.mm,&p.dd); if(p<p_max&&p_min<p){ people.insert(p); } } cout<<people.size(); if(people.size()) cout<<' '<<people.rbegin()->name<<' '<<people.begin()->name; }
六、总结
1.sort函数的用法
sort的定义有以下两种:
void sort (RandomAccessIterator first, RandomAccessIterator last);
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
排序的对比元素的大小。sort可以用自定义的比较函数进行排序,也可以用系统的4种函数排序:less()
、greater()
、less_qual()
、greater_equal()
。默认使用less()
。
2.重载操作符<
排序
对于结构体进行排序,一般需要定义结构体元素的优先级,重载格式为(注意使用const
)
bool operator <(const TYPE& x)const{
if(a!=x.a){
return a<x.a;
}
else if(b!=x.b){
return b<x.b;
}
.....
}