PTA乙级 人口普查 1028

题目

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

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

输入格式:
输入在第一行给出正整数 N,取值在(0,10
​5
​​ ];随后 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>
struct Birthday{char str[6];//姓名int y,m,d;//出生日期int flag;//是否有效int x;
}a[100001];
int main(){int N,i;scanf("%d",&N);for(i=0;i<N;i++){scanf("%s",a[i].str);scanf("%04d/%02d/%02d",&a[i].y,&a[i].m,&a[i].d);a[i].x=a[i].y*10000+a[i].m*100+a[i].d;//将出生日期转变为8位整数,这里是程序的精髓,转化为整数形式//易于判断数据是否有效和后续比较年龄大小        if(a[i].x<18140906)//if(a[i].y<1814||(a[i].y==1814&&a[i].m<9)||(a[i].y==1814&&a[i].m==9&&a[i].d<6))a[i].flag=0;else if(a[i].x>20140906)//else if(a[i].y>2014||(a[i].y==2014&&a[i].m>9)||(a[i].y==2014&&a[i].m==9&&a[i].d>6))a[i].flag=0;elsea[i].flag=1;}int num=0,maxbir=20140906,minbir=18140906;//maxbir为最年长者,初始值取最年幼的出生日期20140906;min同理int m,n;//m,n用于记录最年长和年幼者数组下标 for(i=0;i<N;i++){if(a[i].flag){num++;if(maxbir>=a[i].x){//此处求最年长者,故其出生日期最早,即x数值最小 maxbir=a[i].x;m=i;}if(minbir<=a[i].x){//此处求最年幼者,故其出生日期最晚,即x数值最大           minbir=a[i].x;n=i;}}} printf("%d",num);if(num){//此处设置if语句是考虑num==0时,应该只输出0,且末尾无空格    printf(" ");printf("%s ",a[m].str);printf("%s",a[n].str);}return 0;
}

反思

1.利用链表来储存数据可以在一组中储存不同类型
2.将出生日期转化为八位数进行比较大小,简化比较过程
3.不将符合条件的组单独写出,直接返回下标,再一次简化算法

PTA乙级1028 人口普查相关推荐

  1. C++学习之路 | PTA乙级—— 1028 人口普查 (20 分)(精简)

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

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

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

  3. pat 乙级 1028 人口普查(C++)

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

  4. PAT乙级—1028. 人口普查(20)-native

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

  5. pat乙级 1028 人口普查

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

  6. PAT乙级(1028 人口普查)

    输入格式: 输入在第一行给出正整数 N,取值在(0,10​5​​]:随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串).以及按 yyyy/mm/dd(即年/月/日)格式给出 ...

  7. PAT乙级C语言 1028 人口普查

    思路 判断是否符合要求并计数,把符合的结构输入另一个数组,对该数组进行qsort排序,然后输出第一个和最后一个元素里的相关成员 推荐 我觉得这个写的很好(呜呜呜我写了七十几行人家写二十几行就好了,差距 ...

  8. PTA 1028 人口普查 (c语言)

    1028 人口普查 (20 分) 分析:这个题还是比较直接的,没有什么坑.我在这里是写了一个专门用以比较的函数,然后比较的时候把他们的年月日当成一个大数字来比较. typedef struct{cha ...

  9. 【PAT乙级】1028 人口普查

    目录 一.题目 二.我的AC代码 一.题目 1028 人口普查 (20分)   某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人.   这里确保每个输入的日期都是合 ...

最新文章

  1. HBuilderX 连接电脑的模拟器问题
  2. sql语句中as的用法和作用
  3. java快速排序直观演示代码,排序算法总结(含动图演示和Java代码实现)
  4. 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
  5. MyBatis 源码自我解读
  6. 单片机并口应用实验c语言,1单片机并口简单应用(流水灯).docx
  7. c++ new操作符(new operator)、operator new、placement new 、operator new[] 及相对应的delete 操作符、operator delete
  8. android日历控件使用,Android学习教程之日历控件使用(7)
  9. 最好的jpg转pdf软件
  10. PowerMill2019基础到三四五轴编程视频教程全
  11. SpringBoot application.properties读取属性配置文件中文显示为乱码问题的解决
  12. 磨金石教育摄影技能干货分享|有哪些让你难以忘怀的人文摄影照片
  13. Google Play开发者账号注册
  14. JDBC数据库驱动的下载与安装与连接
  15. 闭锁java_实例讲解Java并发编程之闭锁
  16. 【机器学习】孤立森林
  17. JSOI2019招待
  18. Python---数据分析---绘制条形图---横竖条形图
  19. 服务器放在北极什么位置,服务器放在北极和深海,是谁给了你勇气?
  20. D - The Beatles CodeForces - 1143D

热门文章

  1. mysql数据库自动降级_mysql降级caveats
  2. java里void的意思_void的用法和意义
  3. 转载 STUDY 博客(2)
  4. 数据可视化(七):可视化设计实战
  5. 请记住这个数字-2147483648到2147483647
  6. 将对称分量转换为abc相量
  7. 什么是数据资产?数据资产管理应该如何落地?
  8. pyqtgraph逐点画波形图例子
  9. DDos攻击之DNS Query Flood
  10. Linux系统的常见命令记忆【Ubuntu】