• 1028 人口普查 (20 分)


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

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

    主要思路 使用sort 对其进行排序cmp函数比较的规则 然后从小到大找符合
    sort之后排序是成功的 再找2214/9/6之前和1814/9/6之后的日子
    我的未通过代码:部分正确

    #include<iostream>
    #include<string>
    #include<iomanip>
    #include<algorithm>
    using namespace std;
    
    struct Person
    {
        string name;
        int year;
        int month;
        int day;
    };
    void printPerson(Person a)
    {
        cout<<a.name<<" "<<a.year<<"/";
        cout<<setw(2)<<setfill('0')<<a.month<<"/";
        cout<<setw(2)<<setfill('0')<<a.day;
        cout<<endl;
    }
    int cmp(Person a,Person b)
    {
         bool j=0;
        if(a.year<b.year) j=1;
        if(a.year==b.year)
        {
            if(a.month<b.month) 
                j=1;
             if(a.month==b.month) 
            {
                if(a.day<b.day) 
                    j=1;
            }
        }
            return j;
    }
    int main()
    {
        int n;cin>>n;
        //排序问题
        Person p[n];
        for(int i=0;i<n;i++)
        {
            cin>>p[i].name>>p[i].year;
            cin.get();
            cin>>p[i].month;
            cin.get();
            cin>>p[i].day;
        }
        sort(p,p+n,cmp);
        Person P[n];
        int sum=0;
        for(int i=0;i<n;i++)
        {
    
            if(p[i].year<2014&&p[i].year>1814) {P[sum++].name=p[i].name;}       
            if(p[i].year==2014)
            {
                if(p[i].month<9) {P[sum++].name=p[i].name;}
                if(p[i].month==9)
                    if(p[i].day<=6) {P[sum++].name=p[i].name;}
            }
            if(p[i].year==1814)
            {
                if(p[i].month>9) {P[sum++].name=p[i].name;}
                if(p[i].month==9)
                    if(p[i].day>=6) {P[sum++].name=p[i].name;}
            }
        }
        cout<<sum<<" "<<P[0].name<<" "<<P[sum-1].name<<endl;
    }
    

    正确思路代码
    核心是格式一致 字符串比较比数字比较方便快捷

    #include <iostream>
    using namespace std;
    int main() {
    int n, cnt = 0;
    cin >> n;
    string name, birth, maxname, minname, maxbirth = "1814/09/06", minbirth =
    "2014/09/06";
    for (int i = 0; i < n; i++) {
    cin >> name >> birth;
    if (birth >= "1814/09/06" && birth <= "2014/09/06") {
    cnt++;
    if (birth >= maxbirth) {
    maxbirth = birth;
    maxname = name;
    }
    if (birth <= minbirth) {
    minbirth = birth;
    minname = name;
    }
    }
    }
    cout << cnt;
    if (cnt != 0) cout << " " << minname << " " << maxname;
    return 0;
    }
    
  • 相关阅读:
    共享内存
    利用消息队列实现ECHO_SRV
    LINUX学习:System V消息队列
    linux:利用socketpair来在进程间传递描述符
    react传参
    ajax、axios、fetch
    js 深拷贝和浅拷贝实现
    css----px、rem、em、vw、vh、vm
    Sass、Less 和 Stylus区别
    箭头函数和普通函数对比
  • 原文地址:https://www.cnblogs.com/most-silence/p/15495368.html
Copyright © 2020-2023  润新知