- 人口普查(20)
时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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<cstdio>
struct people{
char name[5];
int year; //出生年份
int month; //出生月份
int day; //出生日期
};
bool young(people a){
//判断是否年轻过头
if(a.year>2014)
return true;
if(a.year==2014&&a.month>9)
return true;
if(a.year==2014&&a.month==9&&a.day>6)
return true;
return false;
}
bool old(people b){
//判断是否老过头
if(b.year<1814)
return true;
if(b.year==1814&&b.month<9)
return true;
if(b.year==1814&&b.month==9&&b.day<6)
return true;
return false;
}
bool younger(people a,people b){
//判断ab中谁年轻
if(a.year>b.year)
return true;
if(a.year==b.year&&a.month>b.month)
return true;
if(a.year==b.year&&a.month==b.month&&a.day>b.day)
return true;
return false;
}
int main(){
int count=0;
int n;
people a;
people oldest;
oldest.day=6;
oldest.month=9;
oldest.year=2014;
people youngest;
youngest.day=0;
youngest.month=0;
youngest.year=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s %d/%d/%d",a.name,&a.year,&a.month,&a.day);
if(young(a)==false&&old(a)==false){
count++;
if(younger(a,oldest)==false)
oldest=a;
if(younger(a,youngest)==true)
youngest=a;
}
}
if(count==0)
printf("0\n");
else
printf("%d %s %s\n",count,oldest.name,youngest.name);
return 0;
}
更多查看个人博客:https//beatjerome.github.io