PAT乙级—1028. 人口普查(20)-native
2016-05-17 14:28
330 查看
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
思路:这里的问题主要是保证把在[1814/9/6,2014/9/6]之间的人保存在一个数组中,对这个数组进行排序,最后输出数组长度,最大最小值即可。
题目链接:
https://www.patest.cn/contests/pat-b-practise/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
思路:这里的问题主要是保证把在[1814/9/6,2014/9/6]之间的人保存在一个数组中,对这个数组进行排序,最后输出数组长度,最大最小值即可。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct Person{ char name[7]; int year; int month; int day; }; bool Cmp1(Person person){ //判断是否小于2014/9/6 if (person.year>2014) return false; else if (person.year==2014&&person.month>9) return false; else if(person.year==2014&&person.month==9&&person.day>6) return false; return true; } bool Cmp2(Person person){ //判断是否大于1814/9/6 if(person.year<1814) return false; else if(person.year==1814&&person.month<9) return false; else if (person.year==1814&&person.month==9&&person.day<6) return false; return true; } bool Cmp3(const Person p1,const Person p2){ //自定义比较函数,年龄相同比较月份,月份相同,比较天数 if(p1.year!=p2.year) return p1.year<p2.year; else{ if(p1.month!=p2.month){ return p1.month<p2.month; }else{ if(p1.day!=p2.day) return p1.day<p2.day; } } } int main(){ int N; scanf("%d",&N); Person person ; Person person_match ; for(int i=0;i<N;i++){ scanf("%s%d/%d/%d",person[i].name,&person[i].year,&person[i].month,&person[i].day); } int count=0; int j=0; for(int i=0;i<N;i++){ if(Cmp1(person[i])&&Cmp2(person[i])){ //符合条件的保存在person_match中 count++; person_match[j++]=person[i]; } } sort(person_match,person_match+j,Cmp3); if(j==0) printf("0\n"); //没有符合条件的输出0 else printf("%d %s %s",count,person_match[0].name,person_match[j-1].name); return 0; }
题目链接:
https://www.patest.cn/contests/pat-b-practise/1028
相关文章推荐
- SCRUM:第一天任务实现情况
- 11.5 委托
- JSP中的EL表达式(1)
- UIProgressView进度条
- 服务器性能慢的原因一种设想
- 架构漫谈(四):如何做好架构之架构切分
- 网页乱码需要注意的地方
- 磁盘 I/O 性能监控指标和调优方法
- 施密特触发器电路及工作原理
- git提交A时导致Submitted, Merge Pending, A依赖B(B状态为ABANDONED )
- ionic安装插件常用命令
- 静态方法与非静态方法的区别
- 将String日期时间格式转换及截断
- 各种内存分配方式产生的动机
- Spring MVC 项目搭建 -3- 快速 添加 spring security
- JMX在Tomcat的应用
- UML的简单认识
- Unbuntu环境下配置Apache
- C/C++中的虚析构函数和私有析构函数的使用
- git开源库——调试