1028 人口普查 (20 分)

简介: 1028 人口普查 (20 分)

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


这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 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;
class birth {
public:
  int year;
  int month;
  int day;
  bool isbirth() {
    return ((year < 2014 || (year == 2014 && month < 9) || (year == 2014 && month == 9 && day <= 6)) &&
      (year > 1814 || (year == 1814 && month > 9) || (year == 1814 && month == 9 && day >= 6)));
  }
  bool operator>(birth b2) {
    return  (year > b2.year || (year == b2.year && month > b2.month) || (year == b2.year && month == b2.month && day > b2.day));
  }
};
class person {
public:
  birth birthday;
  string name;
};
int main()
{
  int N;
  person young;
  young.birthday.year = 2020;
  person old;
  int count=0;
  cin >> N;
  person tmp;
  for (int i = 0; i < N; i++) {
    cin >> tmp.name;
    scanf("%d/%d/%d", &tmp.birthday.year, &tmp.birthday.month, &tmp.birthday.day);
    if (tmp.birthday.isbirth()) {
      count++;
      if (tmp.birthday > old.birthday)
        old = tmp;
      if (young.birthday > tmp.birthday ) 
        young= tmp;
    }
  }
  cout << count;
  if (count != 0) {
    cout << " " << young.name << " " << old.name;
  }
  return 0;
}

想了一下,做了一点修改,当把第一个合法的人给young 和old,(因为这时只有一个人,他同时是最年轻和最老的)

#include<iostream>
#include<string>
using namespace std;
class birth {
public:
  int year;
  int month;
  int day;
  bool isbirth() {
    return ((year < 2014 || (year == 2014 && month < 9) || (year == 2014 && month == 9 && day <= 6)) &&
      (year > 1814 || (year == 1814 && month > 9) || (year == 1814 && month == 9 && day >= 6)));
  }
  bool operator>(birth b2) {
    return  (year > b2.year || (year == b2.year && month > b2.month) || (year == b2.year && month == b2.month && day > b2.day));
  }
};
class person {
public:
  birth birthday;
  string name;
};
int main()
{
  int N;
  person young;
  person old;
  int count=0;
  cin >> N;
  person tmp;
  for (int i = 0; i < N; i++) {
    cin >> tmp.name;
    scanf("%d/%d/%d", &tmp.birthday.year, &tmp.birthday.month, &tmp.birthday.day);
    if (tmp.birthday.isbirth()) {
      if (count == 0) {  
        old = tmp;
        young = tmp;
      }
      count++;
      if (tmp.birthday > old.birthday)
        old = tmp;
      if (young.birthday > tmp.birthday ) 
        young= tmp;
    }
  }
  cout << count;
  if (count != 0) {
    cout << " " << young.name << " " << old.name;
  }
  return 0;
}
相关文章
|
11月前
7-33 出生年 (15 分)
7-33 出生年 (15 分)
109 0
|
10月前
1052 卖个萌 (20 分)//部分正确
1052 卖个萌 (20 分)//部分正确
|
10月前
1053 住房空置率 (20 分)
1053 住房空置率 (20 分)
|
11月前
7-35 情人节 (15 分)
7-35 情人节 (15 分)
78 0
天梯赛真题——7-6 老板的作息表(25 分)
新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了? 本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。
745 0
天梯赛真题——7-6 老板的作息表(25 分)
7-27 兔子繁衍问题(15 分)
7-27 兔子繁衍问题(15 分)
109 0
L1-035 情人节 (15 分)
L1-035 情人节 (15 分)
161 0
L1-035 情人节 (15 分)
L1-033 出生年 (15 分)
L1-033 出生年 (15 分)
239 0
L1-033 出生年 (15 分)
|
测试技术
PAT乙级1004.成绩排名(20分)
PAT乙级1004.成绩排名(20分)
116 0
|
算法 测试技术
h0103. 末日算法 (10 分)
h0103. 末日算法 (10 分)
281 0