题目
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
分析
此题坑在测试点3!
换了两种方法,也测试了没有符合条件的情况,输出的也是0.
然后它还是判错了。。。可能是空字符串的问题??
你需要单独输出。
代码
(1)通过年, 月, 日 单独判断
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
int y = 2014, m = 9 , d = 6;
const int maxn = 1e5+5;
struct People
{
string name;
int year , month , day;
}people[maxn];
int legal(int y , int m , int day)
{
if(2014 - y > 200) //超过200岁的老人
return 0;
if( y > 2014) //未出生
return 0;
else if( y == 2014) //2014/09/06
{
if( m > 9)
return 0; //未出生
else if( m == 9)
{
if( day > 6)
return 0; //未出生
}
}
else if( 2014 - y == 200)
{
if( m < 9)
return 0;//超过年龄
else if( m == 9)
{
if( day < 6)
return 0; //超过年龄
}
}
return 1;
}
bool bmp(People a , People b)
{
if(a.year == b.year)
{
if(a.month == b.month)
{
return a.day <= b.day;
}
else
return a.month <= b.month;
}
else
return a.year <= b.year;
}
int main()
{
int n;
cin >> n;
int idx = 0;
for(int i = 0 ; i < n ; i++)
{
People tmp;
cin >> tmp.name;
char ch;
scanf("%d%c%d%c%d" ,&tmp.year,&ch,&tmp.month,&ch,&tmp.day);
if(legal(tmp.year ,tmp.month , tmp.day))
{
people[idx ++ ] = tmp;
// cout << tmp.name<< endl;
}
}
sort(people , people + idx , bmp);
if(idx == 0)
cout << 0 << endl;
else
cout << idx << " " << people[0].name << " " <<people[idx - 1].name;
}
(2)通过字符串直接判断
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
string datamax = "2014/09/06";
string datamin = "1814/09/06";
const int maxn = 1e5+5;
struct People
{
string date;
string name;
}people[maxn];
bool cmp(struct People a , struct People b)
{
return a.date < b.date;
}
int main()
{
int n;
cin >> n;
int idx = 0;
for(int i = 0 ; i < n; i ++)
{
string s1,s2;
cin >> s1 >> s2;
if(s2 > datamax || s2 < datamin)
continue;
else
{
people[idx ++ ] = {s2 , s1};
}
}
sort(people , people + idx ,cmp);
if(idx == 0 )
cout << 0 << endl;
else
cout << idx << " " << people[0].name << " " << people[idx - 1].name << endl;
}