【PAT (Basic Level) Practice】——【查找元素】1028 人口普查

文章目录

一【题目难度】

  • 乙级

二【题目编号】

  • 1028 人口普查 (20 分)

三【题目描述】

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

四【题目示例】

  • 输入格式:
    输入在第一行给出正整数 N N N,取值在 ( 0 , 1 0 5 ] (0,10^5 ] (0,105];随后 N N N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 y y y y / m m / d d yyyy/mm/dd 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

五【解题思路】

  • 这个题大致思路和1004 成绩排名 (20 分)差不多,都是新建一个结构体保存主要信息,然后通过比较得出结果,只是这道题的比较更复杂一些,具体步骤如下:
  • ①:新建 P e r s o n Person Person结构体存储人的姓名,以及生日
  • ②:新建 l e s s less less函数,这个函数的作用是 a < = b ( 年 、 月 、 日 ) a<=b(年、月、日) a<=b(年、月、日)返回$ t r u e true true,否则返回 f a l s e false false
  • ③:新建 m o r e more more函数,这个函数的作用是 > = b ( 年 、 月 、 日 ) >=b(年、月、日) >=b(年、月、日)返回$ t r u e true true,否则返回 f a l s e false false
  • ④:新建 i n i t init init函数,这个函数的作用是初始化参数,young为最年轻的人,old为最年长的人,start为最小边界,end为最大边界
  • ⑤:新建 m a i n main main主函数,扫描人数为n,初始化num为0,这个参数的作用是保存数据合法人数,之后开始逐行扫描输入,如果输入数据合法,num++,并且若当前数据(temp)比最年轻的还要年轻要更新,若当前数据(temp)比最年轻的还要年轻要更新,注意这里不能使用 i f … e l s e if…else if…else判断,因为最年轻和最年长可能是同一个人,扫描完之后就是输出,这里还有一个点需要注意,若num为0,特判输出为0,否则会因为后面多输出空格而导致格式错误,其余正常输出即可

六【最终得分】

  • 20分

七【代码实现】

#include<stdio.h>
#include<stdbool.h>

struct Person
{
    char name[10];
    int y,m,d;
}old,young,start,end,temp;

bool less(struct Person a,struct Person b)
{
    if(a.y != b.y)
    {
        return a.y <= b.y;
    }
    else if(a.m != b.m)
    {
        return a.m <= b.m;
    }
    else
    {
        return a.d <= b.d;
    }
}

bool more(struct Person a,struct Person b)
{
    if(a.y != b.y)
    {
        return a.y >= b.y;
    }
    else if(a.m != b.m)
    {
        return a.m >= b.m;
    }
    else
    {
        return a.d >= b.d;
    }
}

void init()
{
    young.y = 1814;
    young.m = 9;
    young.d = 6;
    old.y = 2014;
    old.m = 9;
    old.d = 6;
    start.y = 1814;
    start.m = 9;
    start.d = 6;
    end.y = 2014;
    end.m = 9;
    end.d = 6;
}

int main()
{
    init();
    int n = 0,num = 0;
    scanf("%d",&n);
    for(int i = 0;i<n;i++)
    {
        scanf("%s %d/%d/%d",&temp.name,&temp.y,&temp.m,&temp.d);
        if(less(start,temp) && more(end,temp))
        {
            num++;
            if(more(old,temp))
            {
                old = temp;
            }
            if(less(young,temp))
            {
                young = temp;
            }
        }
    }
    if(num == 0)
    {
        printf("0\n");
    }
    else
    {
        printf("%d %s %s\n",num,old.name,young.name);
    }
    return 0;
}

八【提交结果】

【PAT (Basic Level) Practice】——【查找元素】1028 人口普查

上一篇:数字孪生-基于数字双引擎的数字双车间构建方法研究


下一篇:ML之LoR&DT&RF:基于LoR&DT(CART)&RF算法对mushrooms蘑菇数据集(22+1,6513+1611)训练来预测蘑菇是否毒性(二分类预测)