• 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
    
     
    思路:我这里相当于是枚举的写法,略微有点复杂,用string存出生日期写可能会更简单一点,有个坑点就是有效生日个数为0的情况......
     
     1 #include<stdio.h>
     2 #include<math.h>
     3 #include<string.h>
     4 #include<stdlib.h>
     5 typedef struct birth
     6 {
     7     char name[6];
     8     int year;
     9     int month;
    10     int day;
    11 } St;
    12 int main()
    13 {
    14     int n;
    15     scanf("%d",&n);
    16     St num[n];
    17     int t=n;//有效生日数
    18     int maxyear=-1,maxmonth=-1,maxday=-1,minyear=9999,minmonth=9999,minday=9999;
    19     for(int i=0;i<n;i++)
    20     {
    21         scanf("%s %d/%d/%d",num[i].name,&num[i].year,&num[i].month,&num[i].day);
    22         if(((num[i].year<1814)||((num[i].year==1814)&&(num[i].month<9))||((num[i].year==1814)&&(num[i].month==9)&&(num[i].day<6)))||((num[i].year>2014)||((num[i].year==2014)&&(num[i].month>9))||((num[i].year==2014)&&(num[i].month==9)&&(num[i].day>6))))
    23         {
    24             t--;
    25             continue;
    26         }
    27         if(num[i].year>maxyear)
    28            {
    29             maxyear=num[i].year;
    30             maxmonth=num[i].month;
    31             maxday=num[i].day;
    32         }
    33         else if(num[i].year==maxyear&&num[i].month>maxmonth)
    34         {
    35             maxmonth=num[i].month;
    36                 maxday=num[i].day;
    37         }
    38         else if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day>maxday)
    39         {
    40             maxday=num[i].day;
    41         }
    42         if(num[i].year<minyear)
    43         {
    44             minyear=num[i].year;
    45             minmonth=num[i].month;
    46             minday=num[i].day;
    47         }
    48         else if(num[i].year==minyear&&num[i].month<minmonth)
    49         {
    50             minmonth=num[i].month;
    51             minday=num[i].day;
    52         }
    53         else if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day<minday)
    54         {
    55             minday=num[i].day;
    56         }
    57     }
    58     if(t==0)
    59         printf("%d",t);
    60     else 
    61         printf("%d ",t);
    62     for(int i=0;i<n;i++)
    63     {
    64         if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day==minday)
    65             printf("%s ",num[i].name);
    66     }
    67     for(int i=0;i<n;i++)
    68     {
    69         if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day==maxday)
    70         printf("%s",num[i].name);
    71     }
    72     return 0;
    73 }

     补充用string写的解法,相比于上面的解法更简单,(果然还是string好用)......

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<cstdio>
     5 #include<algorithm>
     6 #include<map>
     7 #include<set>
     8 #include<vector>
     9 using namespace std;
    10 #define ll long long 
    11 #define inf 99999999
    12 int main()
    13 {
    14     string str1="2014/09/06",str2="1814/09/06";
    15     string min="2014/09/06",max="1814/09/06";
    16     string min_name,max_name;
    17     int N;
    18     scanf("%d",&N);
    19     string name,date;
    20     int sum=0;
    21     for(int i=1;i<=N;i++)
    22     {
    23         cin>>name>>date;
    24         if(date>=str2&&date<=str1)
    25         {
    26             sum++;
    27             if(date<min)
    28             {
    29                 min=date;
    30                 min_name=name;
    31             }
    32             if(date>max)
    33             {
    34                 max=date;
    35                 max_name=name;
    36             }
    37         }
    38     }
    39     if(sum==0)//sum为0直接特判 
    40         printf("%d
    ",sum);
    41     else
    42         cout<<sum<<" "<<min_name<<" "<<max_name<<endl; 
    43     return 0;
    44  } 
    大佬见笑,,
  • 相关阅读:
    angular2.0学习笔记4.npm常用指令记录及angular语法
    angular2.0学习笔记7.echarts 地图(type:'map')slice undifined 出错问题
    angular2.0学习笔记6.编程风格指南
    ionic3搭建笔记及编译成apk
    Ionic3--数据存储
    webpack入门笔记
    angular2.0学习笔记3.了解angular2.0项目结构
    angular2.0学习笔记2.创建hello world项目
    UVA 10954 Add All
    POJ 3069 Saruman's Army
  • 原文地址:https://www.cnblogs.com/xwl3109377858/p/10473219.html
Copyright © 2020-2023  润新知