• PAT——乙级1028


    这道题花了我半个多小时,对呀乙级算是挺多时间的了。

    1028 人口普查 (20 point(s))

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

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

     我写的代码是

     1 #include<cstdio>
     2 
     3 struct People
     4 {
     5     char name[6];
     6     int year;
     7     int month;
     8     int day;
     9 }old,young,temp;
    10 
    11 int compare(People a, People b) {
    12     if ((a.year > 2014) || (a.year == 2014 && a.month > 9) || (a.year == 2014 && a.month == 9 && a.day > 6)) //判断是否超过当前日期
    13         return 0;
    14     if((a.year < 1814) || (a.year == 1814 && a.month < 9) || (a.year == 1814 && a.month == 9 && a.day < 6))//判断是否大于200岁
    15         return 0;
    16     if (a.year < b.year || (a.year == b.year&&a.month < b.month) || (a.year == b.year && a.month == b.month && a.day < b.day))//满足上面两个条件才比较两个日期的大小
    17         return -1;
    18     if (a.year > b.year || (a.year == b.year&&a.month > b.month) || (a.year == b.year && a.month == b.month && a.day > b.day))//-1是小于,1是大于
    19         return 1;
    20     return 2;
    21 
    22 }
    23 int main() {
    24     int n,count=0,flag1,flag2;
    25     young = { "",0,0,0 };
    26     old = { "",2014,9,6};
    27     scanf("%d", &n);
    28     while (n--)
    29     {
    30         scanf("%s %d/%d/%d", &temp.name, &temp.year, &temp.month, &temp.day);
    31         flag1 = compare(temp, old);//flag1和flag2都是为了保存判断状态
    32         if ( flag1== -1)
    33         {
    34             old = temp;
    35         }
    36         flag2 = compare(temp, young);
    37         if ( flag2== 1)
    38         {
    39             young = temp;
    40         }
    41         if (flag1 || flag2)//如果两次判断都不为零,也就是满足条件,那就count+1。
    42         {
    43             count++;
    44         }
    45     }
    46     if (count == 0) printf("0");
    47     else printf("%d %s %s", count, old.name, young.name);
    48     return 0;
    49 }

    注意点:

    如果所有人的生日都不满足条件,记得必须单独输出一个0;否则会因为多输出空格导致格式错误的。

    再一次体会到PATOJ比牛客OJ更严格。

    old = temp;
    这一行是让直接把结构体的值赋给另一个结构体。

    但是用g++编译器会报错,提示结构体并没有重载=

    但是用clang++编译器就不会报错。我查了一下clang++与g++的区别

    gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 编译器。gcc 是 GNU 亲儿子。clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是 Mac(XCode) 的默认编译器,微软等大公司也都在使用

    前景最好的应该是clang,错误提示/编译速度都是一流。另外现在有很多代码自动完成/提示工具是基于clang的。clang编译出的debug文件已经可以用gdb调试了哈,vs2015也内置了clang来提供对cross platfrom的支持。

    gcc/g++/msvc因为面向了具体的platform,所以老的项目里面可能用了他们自带的扩展/或者在彼此应用环境下有一些best practice,这个没有办法,还得接着用。

     我在我的VS2017上编译很正常。

    其他底层的我也不清楚了,反正以后用clang++就好。

  • 相关阅读:
    解决tomcat启东时一闪而过的问题
    如果数据库中的时间类型与mybatis的时间类型对应关系
    el 表达式中某一项过长时需要截取字符串长度,当悬停的时候显示全部内容
    ubuntu/linux系统中安装jdk以及eclipse(附图解详细步骤)
    Unity利用SMSSDK实现短信验证码(附代码)
    Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)
    Unity编辑器扩展
    VR中射线点击按钮的实现
    Unity中几个特殊路径在各个平台的访问方式
    多态
  • 原文地址:https://www.cnblogs.com/albert-yzp/p/9998140.html
Copyright © 2020-2023  润新知