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
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
/*
1028 人口普查
https://pintia.cn/problem-sets/994805260223102976/exam/problems/994805293282607104
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
//根据题目构造的人结构体
struct People
{
char name[5];
int year;
int month;
int day;
};
//自定义比较器
bool Compare(People& a,People& b)
{
if(a.year==b.year)
{
if(a.month==b.month)
return a.day<b.day;
return a.month<b.month;
}
return a.year<b.year;
}
//冒泡排序 这个代码不建议
void BubbleSort(People *peoples,int num)
{
for(int i=0;i<num;i++)
{
for(int j=0;j<num-i-1;j++)
{
if(peoples[j].year>peoples[j+1].year)
{
People temp=peoples[j];
peoples[j]=peoples[j+1];
peoples[j+1]=temp;
}
else if(peoples[j].year==peoples[j].year)
{
if(peoples[j].month>peoples[j+1].month)
{
People temp=peoples[j];
peoples[j]=peoples[j+1];
peoples[j+1]=temp;
}else if(peoples[j].month==peoples[j+1].month)
{
if(peoples[j].day>peoples[j+1].day)
{
People temp=peoples[j];
peoples[j]=peoples[j+1];
peoples[j+1]=temp;
}
}
}
}
}
}
int main()
{
int num;
scanf("%d",&num);
People peoples[num];
for(int i=0;i<num;i++)//数据的录入
scanf("%s %d/%d/%d",peoples[i].name,
&peoples[i].year,&peoples[i].month,&peoples[i].day);
People suitPeople[num];//满足题目要求的正常的人
int count=0;
for(int i=0;i<num;i++)
{
if(peoples[i].year>2014||peoples[i].year<1814)//年份大于2014的是还未出生的,应该过滤
continue;
if(peoples[i].year==1814)//1814年生的,判断月份
{
if(peoples[i].month<9)//月份小于9也不行
continue;
if(peoples[i].month==9)//月份相等,看日子
{
if(peoples[i].day<6)//日子小于6也不行
continue;;
}
}
else if(peoples[i].year==2014)//2014年生的,判断月份
{
if(peoples[i].month>9)//月份大于9也不行
continue;
if(peoples[i].month==9)//月份相等,看日子
{
if(peoples[i].month>6)//日子大于6也不行
continue;;
}
}
suitPeople[count++]=peoples[i];
}
// sort(suitPeople,suitPeople+count,Compare);//年龄排序
BubbleSort(suitPeople, count);
// printf("count=%d\n",count);
// for(int i=0;i<count;i++)//数据的输出
// printf("%s %d/%d/%d\n",suitPeople[i].name,
// suitPeople[i].year,suitPeople[i].month,suitPeople[i].day);
printf("%d %s %s",count,suitPeople[0].name,suitPeople[count-1].name);
return 0;
}