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",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\n",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 }

 

posted @ 2016-10-11 11:29  乐乐章  阅读(305)  评论(0编辑  收藏  举报