0
点赞
收藏
分享

微信扫一扫

[PTA-乙级-详解】1028-人口普查(C/C++)

笙烛 2022-01-31 阅读 66

最开始我写的

#include<iostream>
#include<algorithm>
using namespace std;
#include<cstring>
struct Peo
{
    string name;
    int year;
    int month;
    int day;
};
bool cmp(Peo a, Peo b)
{
    if (a.year != b.year)
    {
        return a.year < b.year;
    }
    else if (a.year == b.year && a.month != b.month)
    {
        return a.month < b.month;
    }
    else if (a.year == b.year && a.month == b.month)
    {
        return a.day < b.day;
    }

}
int main()
{
    Peo arr[100000];
    int n;
    cin >> n;
    char c;
    string s1;
    int n1;
    int n2;
    int n3;
    int num = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> s1 >> n1 >> c >> n2 >> c >> n3;
        if (((n1 < 1814) || (n1 == 1814 && n2 < 9) || (n1 == 1814 && n2 == 9 && n3 < 6)) || ((n1 > 2014) || (n1 == 2014 && n2 > 9) || (n1 == 2014 && n2 == 9 && n3 > 6)))
        {
            arr[i].year = 2015;
        }
        else
        {
            arr[i].name = s1;
            arr[i].year = n1;
            arr[i].month = n2;
            arr[i].day = n3;
            num++;
        }
    }
    sort(arr, arr + n, cmp);
    if (num == 0)
        cout << 0;
    else
        cout << num << " " << arr[0].name << " " << arr[num - 1].name;
    return 0;
}

个人认为最好的版本

#include<iostream>
using namespace std;
#include<cstring>

int main()
{
    string old_name, young_name;
    string name, day;
    string young_day = "1814/09/06", old_day = "2014/09/06";
    int n;
    cin >> n;
    int num = n;
    for (int i = 0; i < n; i++)
    {
        cin >> name >> day;
        if (day<"1814/09/06" || day>"2014/09/06")
            num--;
        else
        {
            if (day <= old_day)
            {
                old_name = name;
                old_day = day;
            }
            if (day >= young_day)
            {
                young_name = name;
                young_day = day;
            }
        }
    }
    if (!num)
        cout << 0;
    else
        cout << num << " " << old_name << " " << young_name;
    return 0;
}

思路可学习的版本

#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;
        else
            a[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;
}
举报

相关推荐

0 条评论