您的位置:首页 > 其它

1028. 人口普查

2016-03-30 17:34 246 查看
题目是pat乙级

思路:求最值问题。需要不合法的先过滤

训练目的:结构体 运算符重载
题目描述 

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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 <iostream>
#include <string>
using namespace std;
struct tDate
{
int year;
int month;
int day;
};
bool operator<(const tDate &d1,const tDate &d2)
{
if(d1.year!=d2.year) return d1.year<d2.year;
if(d1.month!=d2.month) return d1.month<d2.month;
return d1.day<d2.day;
}
bool Is(const tDate &date)
{
int days[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if (date.month<1||date.month>12) return false;
if (date.day<1||date.day>days[date.month]) return false;
if (date.year%4!=0&&date.month==2&&date.day==29) return false;
if (date.year%100==0&&date.year%400!=0&&date.month==2&&date.day==29) return false;
tDate d1;
d1.year =1814;
d1.month=9;
d1.day=6;
if (date<d1) return false;
d1.year=2014;
if (d1<date) return false;
return true;
}
int main()
{
int n;
while(cin>>n)
{
string maxS,minS;
tDate maxD,minD;
int cc=0;
bool first=true;
while(n--)
{
tDate date;
string s;
char ch;
cin>>s>>date.year>>ch>>date.month>>ch>>date.day;
if(!Is(date)) continue;
if (first)
{
first=false;
maxD=date;
maxS=s;
minD=date;
minS=s;
}
else
{
if(date<maxD) maxD=date,maxS=s;
if(minD<date) minD=date,minS=s;
}
cc++;
}
if(cc)
cout<<cc<<" "<<maxS<<" "<<minS<<endl;
else
cout<<0<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: