1028 人口普查

一.问题:

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

这里确保每个输入的日期都是合法的,但不一定是合理的------假设已知镇上没有超过 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

二.思路:

1.本题可把输入的生日转换为八位数,这样便于比较得出最年长或最年轻的人,因为题目说了保证最年长和最年轻的人没有并列。所以最年长或最年轻的人有且只有一个。

2.使用结构数组来存储信息更方便。

3.将超过 200 岁的生日和未出生的生日过滤掉。也就是八位数小于18140906和大于20140906的删除。

4.本题容易忽略的一个点就是:对有效生日个数为0个的特殊情况的处理。若有效生日个数为0个则不存在最年长或最年轻的人,相应的,只需输出有效生日个数即可(0),不需要输出最年长或最年轻的人的姓名。

三.代码实现:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

typedef struct person
    {
        char *name;
        int birth;
    } People;

//快速排序
void quick_sort(People*people,int low,int high)
{
    int i = low;
    int j = high;
    int t = i;
    
    char *temp_name = people[t].name;
    int temp_birth = people[t].birth;
    
    char *name;
    int birthday=0;
    
    if(i > j)
    {
        return;
    }
    while(i != j)
    {
        while(people[j].birth >= temp_birth && i < j)
        {
            j--;
        }
         while(people[i].birth <= temp_birth && i < j)
        {
            i++;
        }
        //交换值
        name = people[j].name;
        birthday = people[j].birth;

        people[j].name = people[i].name;
        people[j].birth = people[i].birth;

        people[i].name = name;
        people[i].birth = birthday;

    }
    //交换值
    people[t].name = people[i].name;
    people[t].birth = people[i].birth;

    people[i].name = temp_name;
    people[i].birth = temp_birth;
    //递归
    quick_sort(people,low,i-1);
    quick_sort(people,i+1,high);
}

//转换八位数
int switch_num(int num1,int num2,int num3)
{
    int result = num1*10000+num2*100+num3;
    return result;
}


int main()
{
    //输入数据
    int N=0;
    scanf("%d",&N);
    People people1[N];
    int num1=0;
    int num2=0;
    int num3=0;
    char c1,c2;
    for(int i = 0;i <N;i++)
        {
            people1[i].name = (char*)malloc(sizeof(char)*6);
            scanf("%s %4d%c%2d%c%2d",people1[i].name,&num1,&c1,&num2,&c2,&num3);
            people1[i].birth = switch_num(num1,num2,num3);
        }
    
    //过滤掉不合理的信息
    int sum = N;
    for(int i =0;i<N;i++)
    {
        //超过两百岁的去除
        if(people1[i].birth < 18140906)
        {
            people1[i].name = NULL;
            sum--;
        }
        //还没出生的去除
        else if(people1[i].birth > 20140906)
        {
            people1[i].name = NULL;
            sum--;
        }
    }
    //提取有效数据
    People people2[sum];
    for(int i =0,m=0;i<N;i++)
    {
        if(people1[i].name != NULL)
        {
            people2[m].name = (char*)malloc(sizeof(char)*6);
            people2[m].name = people1[i].name;
            people2[m].birth = people1[i].birth;
            m++;
        }
    }
    
    //生日排序
    quick_sort(people2,0,sum-1);//排序结果:出生日期最早的排第一位,出生日期最晚的排最后一位

    //输出数据
    //输出有效生日的个数
    if(sum == 0)
    {
        printf("%d",sum);
    }
    else
    {
        printf("%d %s %s\n",sum,people2[0].name,people2[sum-1].name);
    }
    
    return 0;
}
相关推荐
木心月转码ing1 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴1 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困4 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub7 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
颜酱19 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone77391 天前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub1 天前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉