转跳点:

1028 人口普查
 

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

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(;随后 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 <stdio.h>
#include <stdlib.h>
#include <string.h> //比较喜欢宏定义,这样写代码移植性强
#define EARLIESTYEAR 1814
#define NOWYEAR 2014
#define NOWMONTH 9
#define NOWDAY 6 typedef struct
{
char name[6];
int year, month, day;
} PersonalData; //输入出生日期合法判断
static int Islegal(PersonalData *temp);
//查找最大最小年龄的人
static void Find(PersonalData *MAX, PersonalData *MIN, const PersonalData *temp); int main(void)
{
int n, count = 0;
PersonalData theoldest = {"\0", 2015, 12, 31}, theyoungest = {"\0", 1813, 1, 1};
scanf("%d", &n); for (int i = 0; i < n; i++)
{
PersonalData temp;
scanf("%s %d/%d/%d", temp.name, &temp.year, &temp.month, &temp.day); if (Islegal(&temp))
{
continue;
}
Find(&theoldest, &theyoungest, &temp);
count++;
} //这里可以直接加个if特判count == 0的情况,我脑子有坑才这么写
printf("%d%s%s%s%s", count, 0 == count ? "" : " ", 0 == count ? "" : theoldest.name, 0 == count ? "" : " ", 0 == count ? "" : theyoungest.name); return 0;
} static void Find(PersonalData *MAX, PersonalData *MIN, const PersonalData *temp)
{
//分了三种情况,出生年月日小于于最大值的年月日的就交换
//生的越早,年份越小,年纪越老
if ((MAX->year > temp->year) ||
(MAX->year == temp->year && MAX->month > temp->month) ||
(MAX->year == temp->year && MAX->month == temp->month && MAX->day > temp->day))
{
*MAX = *temp;
}
//同理
if ((MIN->year < temp->year) ||
(MIN->year == temp->year && MIN->month < temp->month) ||
(MIN->year == temp->year && MIN->month == temp->month && MIN->day < temp->day))
{
*MIN = *temp;
}
} static int Islegal(PersonalData *temp)
{
//年超出的
if (temp->year > NOWYEAR || temp->year < EARLIESTYEAR)
{
return 1;
}
//月份超出的
if ((NOWYEAR == temp->year && temp->month > NOWMONTH) ||
(EARLIESTYEAR == temp->year && temp->month < NOWMONTH))
{
return 1;
}
//日期超出的
if ((NOWYEAR == temp->year && NOWMONTH == temp->month && temp->day > NOWDAY) ||
(EARLIESTYEAR == temp->year && NOWMONTH == temp->month && temp->day < NOWDAY))
{
return 1;
} return 0;
}

贡献一组测试用例

5
John 2051/05/12
Tom 1814/01/06
Ann 2121/01/30
James 1814/09/05
Steve 1671/11/20

结果

0  (没有空格~~~)

  PTA不易,诸君共勉!

P 1028 人口普查的更多相关文章

  1. PAT乙级 1028. 人口普查(20)

    1028. 人口普查(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 某城镇进行人口普查,得到了全体居民的 ...

  2. PAT-乙级-1028. 人口普查(20)

    1028. 人口普查(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 某城镇进行人口普查,得到了全体居民的 ...

  3. PAT 1028 人口普查(20)(STL-set+思路+测试点分析)

    1028 人口普查(20)(20 分) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超 ...

  4. PAT (Basic Level) Practise (中文)-1028. 人口普查(20)

    PAT (Basic Level) Practise (中文)-1028. 人口普查(20)   http://www.patest.cn/contests/pat-b-practise/1028 某 ...

  5. PATB 1028. 人口普查(20)

    1028. 人口普查(20) 注意特判合理人数为0,否则格式错误.很暴力的sort排序找出最大最小. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Stan ...

  6. PAT(B) 1028 人口普查(C)字符串

    题目链接:1028 人口普查 (20 point(s)) 题目描述 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是 ...

  7. PAT 1028. 人口普查(20)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过200岁的老人,而今天是2014年9月 ...

  8. PAT (Basic Level) Practise:1028. 人口普查

    [题目链接] 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是 ...

  9. PAT 1028 人口普查

    https://pintia.cn/problem-sets/994805260223102976/problems/994805293282607104 某城镇进行人口普查,得到了全体居民的生日.现 ...

随机推荐

  1. C# WebApi的controller中如何存取session

    在MVC以后,Session方式可能已经不太常用,但偶尔还是会用到,比如页面验证码之类的.例如登录页面使用的验证码通过Controller提供一个View来实现,可以使用Session来存储这个值.但 ...

  2. ExpandableListActivity

    main.xml: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:an ...

  3. 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)

    在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...

  4. ibd2sdi — InnoDB表空间SDI提取实用程序

    参考mysql8.0官方文档 https://dev.mysql.com/doc/refman/8.0/en/ibd2sdi.html ibd2sdi是一个实用程序,用于从表空间文件中提取 序列化的字 ...

  5. 1-8SpringBoot之切面AOP

    SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍: AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器: @As ...

  6. MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多

    一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...

  7. SciPy 特殊函数

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  8. 深入解读EOS源代码之——区块链内核

    EOS进入大众视野并且受到热议已经有一段时间了,各种热捧和争议过后,是时候让我们静下来搞清楚EOS到底是一个什么样的产品.本文从技术角度深入的分析EOS底层设计,从源代码入手,一层层揭开EOS区块链底 ...

  9. PHPstudy2018 后门简单使用

    首先声明,仅为记录使用. 测试用例php-5.4.45 + Apache index.php 使用Firefox 浏览器,可以编辑并且重发http请求 打印出“net user” base64 加密后 ...

  10. decompiler of java

    运维了两个java项目,但是没有源代码,整天都是各种问题,各方面都不配合.我也只是个小小的兵,但是工作还是要做. 转机 偶然想试一试decomplier,就找到了gd-gui,感觉用着挺好的,到把项目 ...