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


    1028. 人口普查(20)

    时间限制
    200 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

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

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

    #include<stdio.h>
    #include<stdlib.h>
    
    struct PersonNode
    {
        char name[6];
        int year;
        int month;
        int day;
        int err_flag;
        
    }person[100001];
    int main()
    {
        int N,min=-1,max=-1;
        int i,err_count=0,err_flag=0;
        scanf("%d",&N);
        for ( i= 0; i < N; i++)
        {
            scanf("%s %d/%d/%d",&person[i].name,&person[i].year,&person[i].month,&person[i].day);
            person[i].err_flag=0;
            /*check  */
            if(person[i].year<=1814) 
            {
                if(person[i].year<1814) {person[i].err_flag=1;err_count++;}
                else
                {
                    if(person[i].month<=9)
                     {
                        if(person[i].month<9) {person[i].err_flag=1;err_count++;}
                        else
                        {
                            if(person[i].day<=6)
                            {
                                if(person[i].day<6) {person[i].err_flag=1;err_count++;}
                            }
                        }
                     }
    
                }
            }
            /*check  */
         else  
             if(person[i].year>=2014) 
            {
                if(person[i].year>2014) {person[i].err_flag=1;err_count++;}
                else
                {
                    if(person[i].month>=9)
                     {
                        if(person[i].month>9) {person[i].err_flag=1;err_count++;}
                        else
                        {
                            if(person[i].day>=6)
                            {
                                if(person[i].day>6) {person[i].err_flag=1;err_count++;}
                            }
                        }
                     }
    
                }
            }
            if(person[i].err_flag==0)
                min=max=i;
    
        }     
        for ( i= 0; i < N; i++)
        {
             /*find max*/
            if(person[i].err_flag)
                break;
              if(person[i].year>=person[max].year) 
            {
                if(person[i].year>person[max].year) max=i;
                else
                {
                    if(person[i].month>=person[max].month)
                     {
                        if(person[i].month>person[max].month) max=i;
                        else
                        {
                            if(person[i].day>=person[max].day)
                            {
                                if(person[i].day>person[max].day) max=i;
                            }
                        }
                     }
    
                }
            }
                    /*find min*/
             if(person[i].year<=person[min].year) 
            {
                if(person[i].year<person[min].year) min=i;
                else
                {
                    if(person[i].month<=person[min].month)
                     {
                        if(person[i].month<person[min].month) min=i;
                        else
                        {
                            if(person[i].day<=person[min].day)
                            {
                                if(person[i].day<person[min].day) min=i;
                            }
                        }
                     }
    
                }
            }
          
        }
        
        printf("%d %s %s
    ",N-err_count,person[min].name,person[max].name );
    }

    第一个版本没有完全通过, 而且特别占内存。

    这是一个查找问题,我们要做的是计数,跟找出名字, 所以没有必要

    把所有的信息存起来。输入一个判读一个即可。

    如果是最小或者最大,只需要记录下名字。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 
     5 int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day );
     6 int IsLeagl(int year,int month,int day);
     7 int main()
     8 {
     9     int N;
    10     int i,err_count=0,check=0;
    11     char names[6],max_names[6]=" ",min_names[6]=" ";
    12     int year,month,day;
    13     int max_year=2014,max_month=9,max_day=06;
    14     int min_year=1814,min_month=9,min_day=06;
    15     scanf("%d",&N);
    16     for ( i= 0; i < N; i++)
    17     {
    18         scanf("%s %d/%d/%d",names,&year,&month,&day);
    19         /*check  */
    20       if( IsLeagl( year,month,day))
    21         {
    22             check++;
    23             if(BirthdayCmp(year,month,day,max_year,max_month,max_day)==1)
    24             {
    25                 max_year=year;max_month=month;max_day=day;
    26                 strcpy(max_names,names);
    27             }
    28             if(BirthdayCmp(year,month,day,min_year,min_month,min_day)==-1)
    29             {
    30                 min_year=year;min_month=month;min_day=day;
    31                 strcpy(min_names,names);
    32             }
    33          }
    34 
    35     }     
    36   
    37     
    38     if(check)    printf("%d %s %s
    ",check,max_names,min_names );
    39     else printf("0");
    40 }
    41 int IsLeagl(int year,int month,int day)
    42 {
    43     if(year<1814||(year==1814&&month<9)||(year==1814&&month==9&&day<6)) return 0;
    44     else if(year>2014||(year==2014&&month>9)||(year==2014&&month==9&&day>6)) return 0;
    45     else return 1;
    46 }
    47 int BirthdayCmp(int person1year,int person1month,int person1day ,int person2year,int person2month,int person2day )
    48 {
    49     if(person1year<person2year||(person1year==person2year&&person1month<person2month)||(person1year==person2year&&person1month==person2month&&person1day<=person2day)) return 1;
    50     else if(person1year>person2year||(person1year==person2year&&person1month>person2month)||(person1year==person2year&&person1month==person2month&&person1day>=person2day)) return -1;
    51       else return 0;
    52 }
  • 相关阅读:
    获取窗口句柄的几个办法
    我做的第一个网站
    学生信息管理系统
    程序题
    java冒泡排序
    模拟售票窗口,用4个线程模拟4个窗口在售票,共有8张票,用线程同步来实现
    设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序。
    windows server 2012将计算机、回收站、文档等图标添加到桌面
    Javascript金额转化
    eclipse 每次切换工作空间都要重新配置
  • 原文地址:https://www.cnblogs.com/zle1992/p/5948610.html
Copyright © 2020-2023  润新知